小编典典

我如何在异步中使用请求?

all

我想在 中执行并行 http 请求任务asyncio,但我发现这python-requests会阻塞asyncio. 我找到
aiohttp
但它无法使用 http 代理提供 http 请求的服务。

所以我想知道是否有办法在asyncio.


阅读 62

收藏
2022-08-01

共1个答案

小编典典

要将请求(或任何其他阻塞库)与 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语法:

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

2022-08-01