Python 中的 asyncio+aiohttp 为什么还要创建线程

2017-02-21 11:11:43 +08:00
 zl2003cn

asyncio 不是用协程吗?我理解协程就应该是一个进程只创建一个线程,由这个线程自行调度协程,而使用 asyncio+aiohttp 时创建了 25 个线程, gevent+requests 创建了 15 个线程,这又是怎么理解?协程不就是为了节省线程切换带来的性能损耗吗?

4856 次点击
所在节点    Python
14 条回复
chy373180
2017-02-21 11:27:52 +08:00
你从哪里看到有 25 个线程?代码贴下?
wwqgtxx
2017-02-21 12:16:50 +08:00
别的不说,“ gevent+requests 创建了 15 个线程”那只能说明你根本没用对 gevent , monkey patch 肯定没有在代码的第一行就打上
zl2003cn
2017-02-21 13:48:14 +08:00
@wwqgtxx 我用的 grequests 这个库,不知道是不是这个库也没打
zl2003cn
2017-02-21 13:52:50 +08:00
@wwqgtxx 这个库打了 monkey patch 的,难道是 Windows 的锅?
zl2003cn
2017-02-21 13:53:49 +08:00
wwqgtxx
2017-02-21 14:01:31 +08:00
@zl2003cn 不管别的类库打没打,你应该在你程序的第一行(!!!不是在你的 main 函数中,是程序的第一行,第一行,除了注释的第一行!!!)打上 monkey patch
Zzzzzzzzz
2017-02-21 14:09:21 +08:00
gevent 那个正常, 它的 dns resolver 默认是线程池实现, 可以通过设置 GEVENT_RESOLVER=ares 改成 c-ares 的实现
zl2003cn
2017-02-21 14:32:05 +08:00
@wwqgtxx 用 urllib 的版本有打 monkey patch ,更新了代码~
wwqgtxx
2017-02-21 14:39:50 +08:00
7 楼的解释是正确的
DNS queries performed through threadpool (default) or through c-ares (enabled via GEVENT_RESOLVER=ares env var).
zl2003cn
2017-02-21 14:42:57 +08:00
@Zzzzzzzzz 好的,我换 Ubuntu 试试 c-ares
dant
2017-02-21 19:30:52 +08:00
线程池招你惹你了(
另外,如果你用的是基于 IOCP 的 ProactorEventLoop ,那么线程数量可能会更多。
最后,线程要用 Process Explorer 看。
zl2003cn
2017-02-21 21:51:03 +08:00
@dant 没招我惹我:)只是想知道为什么要建立线程池,其对性能有哪些影响
pynix
2017-02-21 22:02:34 +08:00
你使用的可能是个假 aio
zungmou
2017-02-27 11:12:25 +08:00
不开多线程怎么异步呀?

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

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

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

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

© 2021 V2EX