如何在 asyncio python 中使用 subprocess 模块限制并发进程的数量

Posted

技术标签:

【中文标题】如何在 asyncio python 中使用 subprocess 模块限制并发进程的数量【英文标题】:How to limit the number of concurrent processes using subprocess module in asyncio python 【发布时间】:2017-09-04 06:41:26 【问题描述】:
import asyncio
import asyncio.subprocess
args="blah blah argument "     
create=asyncio.create_subprocess_shell(args,stdout=asyncio.subprocess.PIPE)
proc = await create
output= await proc.stdout.read( )

这是我的服务器代码的一部分,它从客户端获得 1000 次并行命中。现在我应该如何限制服务器创建的最大子进程数以运行参数 blah blah。因为这是代码使用了我 100% 的 CPU。我需要在smae cpu上部署其他服务器

【问题讨论】:

值得考虑像 Celery 和 RabbitMQ 这样的东西吗?从长远来看,它可能会给你更多的可扩展性和更好的控制。只是一个想法。 客户端通过websocket连接。而且我运行的过程是 cpu 绑定的。所以我需要异步支持,这让我更喜欢 asyncio。 Celery 和 RMQ 支持这个吗?我从未使用过它们:/ Celery 是一个异步任务队列,而 RabbitMQ 是任务代理。这篇文章给出了一个很好的例子——suzannewang.com/celery-rabbitmq-tutorial 它可能不适合您的应用程序,但如果您以前没有遇到过,值得探索。 【参考方案1】:

asyncio.Semaphore 是一种限制同时作业内部计数器的方法:

sem = asyncio.Semaphore(10)

async def do_job(args):
    async with sem:  # Don't run more than 10 simultaneous jobs below
        proc = await asyncio.create_subprocess_shell(args, stdout=PIPE)
        output = await proc.stdout.read()
        return output

请注意,您应该确保作业数量不会增加太多,然后您才能实际完成它们。否则,您将需要比这更复杂的东西。

【讨论】:

以上是关于如何在 asyncio python 中使用 subprocess 模块限制并发进程的数量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asyncio python 中使用 subprocess 模块限制并发进程的数量

如何使用 asyncio 在 Python 3 中异步运行 requests.get?

python 并发专题(十四):asyncio 实战

python 并发专题(十四):asyncio 实战

如何使用 asyncio 和 concurrent.futures.ProcessPoolExecutor 在 Python 中终止长时间运行的计算(CPU 绑定任务)?

如何使用 asyncio 和 concurrent.futures.ProcessPoolExecutor 在 Python 中终止长时间运行的计算(CPU 绑定任务)?