用 async 去异步执行函数 a 和函数 b,函数 a 用的 aiohttp 发送请求,发多一个,函数 b 用的 asyncio.to_thread 开多线程去执行同步操作(requests),发送请求很多个,同时运行 a 和 b,b 正常运行,但是 a 的请求丢失了,不返回内容,也捕获不到异常.但是单独运行 a,a 就正常运行,各位大佬们,这是怎么回事?
1
future0906 2022-05-04 01:32:53 +08:00
你都用 aiohttp 了,还用线程干嘛? aio 内部有挺多池的,不一定线程安全。
|
2
taomujian OP @future0906 不用线程的话,函数 b 请求过多,会比较慢
|
3
Richard14 2022-05-04 13:18:06 +08:00
@taomujian 这是你的错觉,处理器刷新频率在 1e9 的数量级,一般系统级语言( c 或者 rust )处理寄存器数据,或者 L1 缓存数据大概每秒的处理量也在这个数量级,python 就算比较慢每秒能执行的指令个数也在 1e8 的数量级,相比之下系统对虚拟文件 IO 的处理速度十分有限,大概只有 10 万到 100 万的数量级,相差遥远。所以 IO 瓶颈在于系统处理不处理得过来请求,而不是程序发送不发送得了足够多的请求,IO 复用以后你用单线程多线程都能轻易达到系统处理能力上限
|
4
taomujian OP @Richard14 我把线程改用 aiohttp 后,也是出现请求丢失的现象,这是怎么回事?和服务端处理请求速度是不是有关?
|
5
sss495088732 2022-05-05 13:54:58 +08:00
先解耦再换 httpx
|