首页 > 解决方案 > Asyncio 运行返回结果的任务

问题描述

我来自 C# 背景,Python 的 Asyncio 库让我感到困惑。

我已阅读以下1 2,但我仍不清楚 asyncio 的使用。

我正在尝试在 python 中制作一个异步的网站刮板。

async def requestPage(url):
    request = requests.get(url, headers=headers)
    soup = BeautifulSoup(request.content, 'html.parser')
    return soup


async def main():

    #****** How do I run an async task and store its result to use in another task?
    index_soup = asyncio.ensure_future(requestPage(index_url))
    res = asyncio.gather(index_soup)
    currency_urls = res.select('a[href^="/currencies"]')

    print(currency_urls)


loop = asyncio.get_event_loop()

try:
    
    loop.run_until_complete(main())
finally:
    loop.close() 

标签: pythonpython-asyncio

解决方案


由于requests库不是异步的,你可以使用run_in_executor方法,这样就不会阻塞正在运行的线程。结果,您可以定义requestPage为常规函数并在main函数中调用它,如下所示:

res = await asyncio.gather(loop.run_in_executor(None, requestPage, url)

阻塞函数将在单独的执行器中运行,而控制权将返回给事件循环。

或者您可以尝试使用异步 HTTP 客户端库,例如aiohttp


推荐阅读