python - asyncio - 函数顺序运行而不是同时运行
问题描述
我有一个发送 2 个不同请求的函数。我需要用不同的参数调用这个函数 20 次。
我想同时运行这些函数(不同的参数),以便在请求和响应之间腾出一些时间。
这是一个非常简化的函数:
async def get_data(url):
return requests.get(url)
这就是我所说的:
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(get_data(url)) for url in websites.split('\n')]
group = asyncio.gather(*tasks)
results = loop.run_until_complete(group)
print(results)
loop.close()
问题是它顺序运行而不是同时运行。
很明显,我错过了一些东西。你知道该怎么做吗?
解决方案
不要将协程包裹在 中asyncio.create_task
,用于*
在传递到最后asyncio.gather
调用时解包协程loop.run_until_complete
loop = asyncio.get_event_loop()
tasks = [get_data(url) for url in websites.split('\n')]
group = asyncio.gather(*tasks)
results = loop.run_until_complete(group)
print(results)
loop.close()
另外,它不会并发,因为requests
它不是异步的,它阻塞了线程,您需要使用替代的异步 HTTP 客户端,例如aiohttp
.
推荐阅读
- wpf - 组合框用户手动输入和选择更改
- xml - xslt:从生成的表中替换节点值
- azure - azure runbook 使用 powershell 工作流在表格中发送电子邮件
- node.js - 将变量从 app.get 传递到 pug 视图
- swift - Swift4 - 带有文本字段的多个警报 - 完成处理程序
- node.js - Nodejs Express - 为不受支持的方法返回 405
- groovy - Groovy CliBuilder:定义了任何方法?
- javascript - 动画替代品 Javascript
- database - 表中的最佳实践数据库前缀?
- python - get_error_or_404 返回一个没有属性的元组