在单个线程中使用具有 Python 的阻塞 http 库的并发 http 请求

Concurrent http requests using a blocking http library with Python in a single thread

所以我有这个问题,我正在尝试以特定的方式解决,但我不确定实现起来有多难。

我想使用 Python 3.4 的 asyncio/coroutines 功能来触发许多使用阻塞 http 库的并发 http 请求,例如请求,或任何 Python api 像 aws 的 boto 这样的 http 请求。

我知道在 threads/processes 中 运行 任务的 run_in_executor() 方法,但我想避免这种情况。

我想在单线程中使用 Linux/Unix 内核中的那些 select 功能。

实际上,我正在关注 David Beazley 对此的介绍,并且我正在尝试使用此代码:https://github.com/dabeaz/concurrencylive/blob/master/aserver.py

但没有 future/pool 东西,并使用我的阻塞-api 调用而不是计算斐波那契数。

看来 http 请求还是 运行ning 顺序。

有什么想法可以吗?又如何?

谢谢

不可能。 requests 库对底层套接字进行的所有调用都是阻塞的(即 socket.read),因为套接字处于阻塞模式。您可以将套接字置于非阻塞模式,但 socket.read 会失败。您基本上需要一个事件循环来告诉您何时可以执行 socket.read,但编写阻塞库时并没有考虑到这一点。这就是 asyncio 存在的全部原因;提供不同库可以共享的默认事件循环并使用非阻塞文件描述符(例如套接字)。

使用 aiohttp,它就像 requests 一样简单,并且在这个过程中您可以了解更多关于 asyncio 的知识。 asyncio 和新的 Python 3.5 async/await 语法是网络 IO 的未来;屈服于它(双关语)。