在单个线程中使用具有 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 的未来;屈服于它(双关语)。
所以我有这个问题,我正在尝试以特定的方式解决,但我不确定实现起来有多难。
我想使用 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 的未来;屈服于它(双关语)。