有一个带有输入参数的脚本需要在单独的进程中异步运行(要运行的函数如下所示)。然而,目前有代码,它与主执行线程同步运行并阻止其执行直到完成:
import shlex
import subprocess
import sys
def CreateSubProcess(script, params):
command_line = '\"{0}\" \"{1}\" \"{2}\"'.format(sys.executable, script, params)
args = shlex.split(command_line)
script_process = subprocess.Popen(args, stdout=subprocess.PIPE)
out, err = script_process.communicate()
exit_code = scriptprocess.returncode
如何使脚本在单独的进程中异步工作,并能够检查进程的可行性?
p = subprocess.Popen()
不等待过程完成。要在不长时间阻塞当前线程的情况下检查状态,可以使用p.poll()
.在您的情况下,程序挂在
.communicate()
一个调用上,该调用不会在进程处于活动状态或有输出时返回 read。有多种方法可以让您在不阻塞主线程的情况下读取子进程的输出:后台线程、各种库提供的非阻塞/异步 IO,请参阅有关从 GUI 运行程序的答案中的链接(Widget.tk.createfilehandler()
,GObject.io_add_watch()
和其他)。下面是一般使用streams、fcntl、asyncio、twisted、select从外部程序的输出中读取一行的代码示例,同时从多个进程中读取输出的代码示例。具体选择什么要看具体的任务。