是我对于协程的用法有误还是 http 请求本身就这么消耗资源

2020-06-29 19:13:59 +08:00
 just1

原有的代码是爬虫,化简完代码是这样

import asyncio

import aiohttp


async def worker():
    while 1:
        try:
            async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=5)) as session:
                async with session.post('https://www.baidu.com') as r:
                    _ = await r.text()
        except RuntimeError:
            break


async def main():
    await asyncio.wait([worker() for _ in range(100)])


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

只需要不到 100 个协程,cpu 单核就可以 100%,是我对于协程有错误的理解吗,求指点

3770 次点击
所在节点    Python
21 条回复
yucongo
2020-07-02 11:12:33 +08:00
网上有个 limited_as_completed ( asyncioplus )包,或许适应你要做的。limited_as_completed 的原始作者试过建议将 limited_as_completed 作为 asyncio 的内置标准函数,但好像不成功。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX