首页 > 解决方案 > 是否可以限制在 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,我希望另一个协程开始执行。

这在异步中可能吗?

标签: pythonpython-asyncio

解决方案


我可以建议使用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 个任务。


推荐阅读