按理说 asyncio 封装了 IO 多路复用,应该是用一个线程通过监听文件描述符的方式来管理多个 tcp 连接,但实际测试中好像为每个 tcp 连接创建了一个线程,但是线程总数有封顶,40 个,这个不是特别理解,为什么不是一个线程对应多个 tcp 连接? 测试代码如下:
# -*- coding: utf-8 -*-
import asyncio
import threading
loop = asyncio.get_event_loop()
async def task():
print('start11')
print('当前线程总数:' + threading.activeCount().__str__())
await asyncio.open_connection('www.baidu.com', 80)
await asyncio.sleep(10)
print('stop11')
async def task2():
print('start22')
print('全部启动之后线程数:' + threading.activeCount().__str__())
await asyncio.sleep(13)
print('stop22')
for a in range(10):
loop.create_task(task())
print(f'协程任务总数为:{asyncio.Task.all_tasks().__len__()}')
loop.run_until_complete(task2())
输出为:
协程任务总数为:10
start11
当前线程总数:1
start11
当前线程总数:2
start11
当前线程总数:3
start11
当前线程总数:4
start11
当前线程总数:5
start11
当前线程总数:6
start11
当前线程总数:7
start11
当前线程总数:8
start11
当前线程总数:9
start11
当前线程总数:10
start22
全部启动之后线程数:11
如果把 for 循环中任务数改为 100,最后总共会创建 41 个线程,100 个连接。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.