所以我有这个问题,我试图以一种特殊的方式解决,但我不确定它有多难实现 .
我想使用Python 3.4的asyncio / coroutines功能来触发许多并发的http请求,使用阻塞的http库,比如请求,或任何执行http请求的Python api,如boto for aws .
我知道run_in_executor()方法在线程/进程中运行任务,但我想避免这种情况 .
我想在单线程中使用Linux / Unix内核中的那些选择功能来完成它 .
实际上我正在关注David Beazley对此的介绍,我试图使用这段代码:https://github.com/dabeaz/concurrencylive/blob/master/aserver.py
但是没有未来/池的东西,并使用我的blocking-api调用而不是计算Fibonacci数 .
看来http请求仍在按顺序运行 .
任何想法,如果这是可能的?如何?
谢谢
1 回答
不可能 .
requests
库对底层套接字的所有调用都是阻塞的(即socket.read
),因为套接字处于阻塞模式 . 您可以将套接字置于非阻塞模式,但是socket.read
将失败 . 你基本上需要一个事件循环来告诉你什么时候可以做socket.read
,但是阻塞库不是为了记住 . 这就是asyncio
存在的全部原因;提供一个默认的事件循环,不同的库可以共享和使用非阻塞文件描述符(例如套接字) .使用
aiohttp
,它就像requests
一样简单,并且在此过程中您可以了解有关asyncio
的更多信息 .asyncio
和新的Python 3.5async/await
语法是网络IO的未来;屈服于它(双关语) .