python - Asyncio 运行返回结果的任务
问题描述
我来自 C# 背景,Python 的 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()
解决方案
由于requests库不是异步的,你可以使用run_in_executor方法,这样就不会阻塞正在运行的线程。结果,您可以定义requestPage
为常规函数并在main
函数中调用它,如下所示:
res = await asyncio.gather(loop.run_in_executor(None, requestPage, url)
阻塞函数将在单独的执行器中运行,而控制权将返回给事件循环。
或者您可以尝试使用异步 HTTP 客户端库,例如aiohttp。
推荐阅读
- azure - 将 Bearer 令牌与 azure-sdk-for-js 一起使用
- string - 如何标记两个字符串之间的差异
- javascript - 从值中获取颜色热度
- php - 如何测试与第 3 方 API 交互的服务?
- flutter - 将属性传递给 Equatable 的超级构造函数
- javascript - 如何从另一个 js 文件访问反应组件中定义的变量?
- c# - 列表
- > 作为参数并行发送到 Func 并且 Func 执行多次导致一些列表被复制而其他列表被跳过
- python - 使用 win32com,为什么我可以创建一个新的 excel 工作表,但不能打开一个预先存在的 .xlsm 文件?
- tensorflow - 如何将张量流数据集检索到 numpy 数组中
- javascript - ASP.Net Core javascript 变量无法在控制台中访问