我想在 中执行并行 http 请求任务asyncio,但我发现这python-requests会阻塞asyncio. 我找到了 aiohttp但它无法使用 http 代理提供 http 请求的服务。
asyncio
python-requests
所以我想知道是否有办法在asyncio.
要将请求(或任何其他阻塞库)与 asyncio 一起使用,您可以使用BaseEventLoop.run_in_executor在另一个线程中运行函数并从中获取结果。例如:
import asyncio import requests @asyncio.coroutine def main(): loop = asyncio.get_event_loop() future1 = loop.run_in_executor(None, requests.get, 'http://www.google.com') future2 = loop.run_in_executor(None, requests.get, 'http://www.google.co.uk') response1 = yield from future1 response2 = yield from future2 print(response1.text) print(response2.text) loop = asyncio.get_event_loop() loop.run_until_complete(main())
这将同时获得两个响应。
使用 python 3.5,您可以使用新的await/async语法:
await
async
import asyncio import requests async def main(): loop = asyncio.get_event_loop() future1 = loop.run_in_executor(None, requests.get, 'http://www.google.com') future2 = loop.run_in_executor(None, requests.get, 'http://www.google.co.uk') response1 = await future1 response2 = await future2 print(response1.text) print(response2.text) loop = asyncio.get_event_loop() loop.run_until_complete(main())
有关更多信息,请参阅PEP0492。