使用 asyncio 等待子进程的结果

2023-11-21

我的 Python 脚本包含一个循环,该循环使用subprocess在脚本之外运行命令。每个子进程都是独立的。我监听返回的消息,以防出现错误;我不能忽略子进程的结果。这是没有 asyncio 的脚本(我已将计算量大的调用替换为sleep):

from subprocess import PIPE  # https://docs.python.org/3/library/subprocess.html
import subprocess

def go_do_something(index: int) -> None:
    """
    This function takes a long time
    Nothing is returned
    Each instance is independent
    """
    process = subprocess.run(["sleep","2"],stdout=PIPE,stderr=PIPE,timeout=20)
    stdout = process.stdout.decode("utf-8")
    stderr = process.stderr.decode("utf-8")
    if "error" in stderr:
        print("error for "+str(index))
    return

def my_long_func(val: int) -> None:
    """
    This function contains a loop
    Each iteration of the loop calls a function
    Nothing is returned
    """
    for index in range(val):
        print("index = "+str(index))
        go_do_something(index)

# run the script
my_long_func(3) # launch three tasks

我想我可以用asyncio加速此活动,因为 Python 脚本正在等待外部subprocess去完成。我认为threading or multiprocessing不是必需的,尽管它们也可以提高执行速度。使用任务队列(例如 Celery)是另一种选择。

我尝试实施asyncio方法,但缺少一些东西,因为以下尝试不会改变总体执行时间:

import asyncio
from subprocess import PIPE  # https://docs.python.org/3/library/subprocess.html
import subprocess


async def go_do_something(index: int) -> None:
    """
    This function takes a long time
    Nothing is returned
    Each instance is independent
    """
    process = subprocess.run(["sleep","2"],stdout=PIPE,stderr=PIPE,timeout=20)
    stdout = process.stdout.decode("utf-8")
    stderr = process.stderr.decode("utf-8")
    if "error" in stderr:
        print("error for "+str(index))
    return

def my_long_func(val: int) -> None:
    """
    This function contains a loop
    Each iteration of the loop calls a function
    Nothing is returned
    """
    # https://docs.python.org/3/library/asyncio-eventloop.html
    loop = asyncio.get_event_loop()
    tasks = []
    for index in range(val):
        task = go_do_something(index)
        tasks.append(task)
    # https://docs.python.org/3/library/asyncio-task.html
    tasks = asyncio.gather(*tasks)
    loop.run_until_complete(tasks)
    loop.close()
    return

my_long_func(3) # launch three tasks

如果我想监控每个的输出subprocess但不要等待subprocess跑步,我能从中受益吗asyncio?或者这种情况是否需要类似的东西multiprocessing还是芹菜?


尝试使用执行命令asyncio代替subprocess.

定义一个run()功能:

import asyncio

async def run(cmd: str):
    proc = await asyncio.create_subprocess_shell(
        cmd,
        stderr=asyncio.subprocess.PIPE,
        stdout=asyncio.subprocess.PIPE
    )

    stdout, stderr = await proc.communicate()

    print(f'[{cmd!r} exited with {proc.returncode}]')
    if stdout:
        print(f'[stdout]\n{stdout.decode()}')
    if stderr:
        print(f'[stderr]\n{stderr.decode()}')

然后你可以像调用任何函数一样调用它async功能:

asyncio.run(run('sleep 2'))

#=>

['sleep 2' exited with 0]

例子取自官方文档。也提供here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 asyncio 等待子进程的结果 的相关文章

随机推荐

  • SQL:我可以否定 where 子句中的条件吗?

    我想检查布尔值是否为真 然后在 WHERE 子句中决定使用什么条件 假设布尔变量是 checkbool SELECT FROM TableA A WHERE if checkbool is true run this A Id 123 if
  • 类/伪类和元素/伪元素之间的 CSS 特异性级别如何工作?

    我使用以下定义 改编自 CSS2 规范http www w3 org TR CSS21 cascade html specificity a 在 an 上使用样式属性 元素 b id 属性的数量 c 属性 类 和伪类 link hover
  • 在 Colab 上导入 Kaggle 数据集时出错

    当执行以下几行时 pip install kaggle kaggle competitions download c dogs vs cats p content 我收到以下错误消息 Traceback most recent call l
  • python numpy 中的长(>2000 万元素)数组求和

    我是 python 和 numpy 的新手 所以如果这个问题如此初级 请原谅 我有一个负值数组 已排序 gt gt gt neg 1 53507843e 02 1 53200012e 02 1 43161987e 02 6 37326136
  • 如何将 Pug JSON 对象传递给客户端 JavaScript

    我正在尝试将 JSON 对象从 pug 传递到客户端 JavaScript 以下是代码的结构 我渲染一个 JSON 对象并将其从 Node Express 后端传递给 Pug 代码如下 server js app get myrooms f
  • 在 Alamofire POST 方法中 POST 多个 json 对象 - Swift/IOS

    抱歉 如果我的问题不清楚 我会尽力通过解释使自己清楚 所以这正是我想要做的 我正在尝试使用 Alamofire 发布多个评论 我的应用程序实现的东西 每当用户编写新评论时就会存储为 JSON 对象 我将这些 JSON 注释传递给我的 pos
  • 如何在没有互操作程序集的情况下将任何文件类型嵌入到 Microsoft Word 中

    我正在尝试这样做如何使用 OpenXml 2 0 将任何文件类型嵌入到 Microsoft Word 中 但仅使用 OpenXml SDK 2 5 无互操作程序集 我可以使用以下代码示例嵌入其他 Word 或 Office 文件here 我
  • 如何将数据框的列保留为数据框

    问题 如何提取一列dataframe并保持其结构不变 data lt iris data 1 this will be a vector and will lose the name of the column in dataframe d
  • 我可以快速将字符串转换为代码块吗?

    有什么办法可以将字符串变成代码块吗 我正在向我的网站发出 Ajax 请求 该网站有一个端点以字符串形式返回一些 swift 代码 我可以将该代码作为字符串返回 但我无法运行该代码 因为它不知道它是代码 正如其他人指出的那样 如果您正在创建
  • 当测试失败时如何运行 Maven 目标?

    我想知道当测试失败时是否有办法执行目标 由于maven在遇到测试失败后会停止执行 快速失败模式 那么当测试失败时是否有任何选项可以启动目标 Regards 我也一直在寻找一种方法来做到这一点 但没有取得多大成功 但是 以下问题可能会提供一些
  • 如何测试JDBC驱动是否安装正确以及DB是否可以连接?

    我尝试在家里将其与 Java SDK 一起安装 SDK 工作正常 我现在可以使用命令提示符将 java 程序编译成类 但是我不确定如何测试 JDBC 是否可以连接到我的服务器 数据库 mysql 因为我有一种感觉 我的服务器 这是一个共享网
  • 确定用户是否可以访问所请求的页面?

    我有一个具有多个角色的 ASP Net 网站 每个角色都可以使用共享登录页面访问单独的目录 即管理员用户可以访问 admin 购物者可以访问 shop 等 如果有人访问登录页面 并将返回 URL 设置为他们无权访问的目录 例如 购物者访问
  • os.walk() ValueError:需要超过 1 个值才能解压

    好吧 我正在使用 Bioloid Premium 人形机器人 Mac OS X 无法识别它 因此 我编写了一个 Python 脚本来检测 dev 文件夹中的更改 因为基于 Linux 的系统上的任何连接仍然通过文件描述符给出引用 我的代码应
  • vagrant 中的 postgres(ubuntu 14.04)

    我尝试使用 vagrant 创建简单的开发环境 但遇到了 postgres 的问题 我的 Vagrantfile 很简单 mode ruby vi set ft ruby Vagrantfile API syntax version Don
  • 如何减慢悬停元素上的 CSS 动画而不跳转?

    我正在尝试在 css 中制作选框 这会减慢悬停在元素上的速度 我已经做了类似的事情 但它不会停止主动画 当鼠标退出选取框时 它会返回到它的位置 就好像我没有做任何事情一样 这是 CSS 和 HTML 中的代码 prices backgrou
  • JQuery Mobile 2011 年 6 月 3 日最新版本 - 无后退按钮

    今天是 2011 年 6 月 3 日 我正在使用 JQuery Mobile 的最新版本 我的问题是后退按钮不见了 请问如何才能显示后退按钮 UPDATE 我已经尝试过了 但仍然没有后退按钮 div div h1 title here h1
  • “exp: 未找到命令” 如何将 expo cli 添加到路径?

    我安装了 expo cli npm i g exp 然后我跑 exp 我得到 bash exp command not found 我猜我没有将 exp 添加到路径中 那么我该如何正确地做到这一点呢 到目前为止我尝试过的一切都不起作用 你应
  • 视图在解雇ViewControllerAnimated后不可用:完成:

    我正在迁移使用 NIB 的旧代码以使用手动视图创建 loadView and 自动布局 根视图控制器是容器VC 有 2 个子级 使用自动布局并以模态方式呈现一个视图控制器 该视图控制器的布局在 NIB 中指定 但尚未使用自动布局 之后一切都
  • 如何在 URL 中使用 .jsf 扩展名?

    我正在开发 JSF 2 Web 应用程序 出于声望目的 我希望每个 URL 都以 jsf扩大 现在结束于 xhtml 如果我直接改成 jsf在 Web 浏览器地址栏中显示 HTTP 500 错误 我怎样才能将其设置为 jsf JSF 页面的
  • 使用 asyncio 等待子进程的结果

    我的 Python 脚本包含一个循环 该循环使用subprocess在脚本之外运行命令 每个子进程都是独立的 我监听返回的消息 以防出现错误 我不能忽略子进程的结果 这是没有 asyncio 的脚本 我已将计算量大的调用替换为sleep f