You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中异步调用shell脚本 无需等待执行完成即可运行后续代码

实现方案

你当前使用的subprocess.call()属于阻塞接口,调用后会等待子进程执行完成才会返回,因此会阻塞后续{code block 2}的运行。以下是两种适配你需求的实现方式:

方案1:替换为subprocess.Popen(最轻量化)

subprocess.Popen默认是异步启动子进程,调用后立刻返回,无需等待脚本执行结束:

import subprocess
import signal

# 主程序初始化阶段执行,自动回收结束的子进程,避免产生僵尸进程
signal.signal(signal.SIGCHLD, signal.SIG_IGN)

def process(msg):
    # 异步启动shell脚本,立刻返回
    subprocess.Popen(['sh', './process.sh', msg])

def foo():
    # {code block 1}
    process(msg)
    # {code block 2} 会直接执行,无需等待process.sh运行结束

该方案适配你每秒1-2次的调用频率,只要shell脚本本身不会长时间运行导致累计上百个并行进程,就不会出现性能问题。

方案2:线程异步执行(适合后续扩展处理逻辑)

如果你需要在shell脚本执行完成后追加Python侧的后续处理,可以将process调用放到独立线程中运行,不会阻塞主线程:

import subprocess
import threading

def process(msg):
    subprocess.call(['sh', './process.sh', msg])
    # 此处可添加shell脚本执行完成后的后续处理代码

def foo():
    # {code block 1}
    # 启动守护线程执行process逻辑,主线程不阻塞
    threading.Thread(target=process, args=(msg,), daemon=True).start()
    # {code block 2} 会直接执行

方案优势

  • 线程开销远低于进程,每秒2次的调用频率完全无压力
  • daemon=True设置守护线程后,主程序退出时会自动回收所有工作线程,不会出现进程挂住无法退出的问题

内容的提问来源于stack exchange,提问作者malfoytool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:24:01