使用 asyncio.create_subprocess_exec 设置最大并发

Posted

技术标签:

【中文标题】使用 asyncio.create_subprocess_exec 设置最大并发【英文标题】:Set max concurrency with asyncio.create_subprocess_exec 【发布时间】:2018-05-11 00:01:01 【问题描述】:

我需要使用不同的输入运行一个程序大约 500 次。 我想使用asyncio.create_subprocess_exec 并希望限制同时运行的进程数,以免堵塞机器。 有没有办法设置并发级别?例如,我期望像 AbstractEventLoop.set_max_tasks 这样的东西。

【问题讨论】:

使用asyncio.Semaphore 【参考方案1】:

作为@AndrewSvetlov 的suggested,您可以使用asyncio.Semaphore 来强制执行限制:

async def run_program(input):
    p = await asyncio.create_subprocess_exec(...)
    # ... communicate with the process ...
    p.terminate()
    return something_useful

async def run_throttled(input, sem):
    async with sem:
        result = await run_program(input)
    return result

LIMIT = 10

async def many_programs(inputs):
    sem = asyncio.Semaphore(LIMIT)
    results = await asyncio.gather(
        *[run_throttled(input, sem) for input in inputs])
    # ...

【讨论】:

以上是关于使用 asyncio.create_subprocess_exec 设置最大并发的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份