python - 是否可以限制在 asyncio 中同时运行的协程数量?
问题描述
我已经使用 asyncio 编写了我的脚本,但发现同时运行的协程数量太大,并且经常会挂起。
所以我想同时限制协程的数量,一旦达到限制,我想在执行另一个协程之前等待任何协程完成。
我当前的代码如下所示:
loop = asyncio.get_event_loop()
p = map(my_func, players)
result = loop.run_until_complete(asyncio.gather(*p))
async def my_func(player):
# something done with `await`
是players
类型list
并包含许多元素(例如,12000)。它需要大量的计算资源来同时运行它们,asyncio.gather(*p)
所以我希望同时运行的玩家数量为 200。一旦达到 199,我希望另一个协程开始执行。
这在异步中可能吗?
解决方案
我可以建议使用asyncio.BoundedSemaphore
.
import asyncio
async def my_func(player, asyncio_semaphore):
async with asyncio_semaphore:
# do stuff
async def main():
asyncio_semaphore = asyncio.BoundedSemaphore(200)
jobs = []
for i in range(12000):
jobs.append(asyncio.ensure_future(my_func(players[i], asyncio_semaphore)))
await asyncio.gather(*jobs)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.set_debug(True)
loop.run_until_complete(main())
这样,只有 200 个并发任务可以获取信号量并使用系统资源,而手头有 12000 个任务。
推荐阅读
- flask - ubuntu 16.04 上的 Python flask socketio(传输=池错误)
- outlook-addin - Outlook 加载项中的 RoamingSettings 似乎无法正常工作
- node.js - 如何在 Node JS 中设置 AWS s3 存储桶版本控制?
- c - 使用文件作为已编译 c 程序的输入
- javascript - 无法调用 javascript 和 css 外部文件
- node.js - 部署在 Azure 上的 node.js。没有安装依赖
- vue.js - 来自 Vue 路由器的 ViewBag.Title
- internet-explorer - Guided Tours Fail-on-Startup with Internet Explorer 11
- java - How to make swagger to handle wrappers with generics like Flux
? - javascript - *NgFor 切换显示/隐藏单个元素