我在使用时遇到一些问题subprocess.Popen()
使用线程从我的 python 脚本生成同一应用程序的多个实例,使它们同时运行。在每个线程中,我使用以下命令运行应用程序popen()
调用,然后我通过调用等待它完成wait()
。问题似乎在于wait()
-call 实际上并不等待进程完成。我进行了实验,仅使用一个线程,并在进程开始和结束时打印出文本消息。所以线程函数看起来像这样:
def worker():
while True:
job = q.get() # q is a global Queue of jobs
print('Starting process %d' % job['id'])
proc = subprocess.Popen(job['cmd'], shell=True)
proc.wait()
print('Finished process %d' % job['id'])
job.task_done()
但即使当我只使用一个线程时,它也会在出现任何“已完成进程...”消息之前打印出几条“正在启动进程...”消息。是否存在以下情况:wait()
其实不等吗?我有几个不同的外部应用程序(C++ 控制台应用程序),这些应用程序又将同时运行多个实例,对于其中一些实例,我的代码可以工作,但对于其他应用程序,则不能。外部应用程序是否存在某些问题,会以某种方式影响对wait()
?
创建线程的代码如下所示:
for i in range(1):
t = Thread(target=worker)
t.daemon = True
t.start()
q.join() # Wait for the queue to empty
Update 1:
我还应该补充一点,对于某些外部应用程序,我有时会得到返回代码(proc.returncode
)为-1073471801。例如,其中一个外部应用程序将在前两次给出该返回代码Popen
被调用,但不是最后两个(当我有四份工作时)。
Update 2:
为了澄清事情,现在我有四个作业在队列中,这是四个不同的测试用例。当我运行代码时,对于其中一个外部应用程序,前两个应用程序Popen
-调用生成返回码-1073471801。但是如果我打印确切的命令Popen
调用,并在命令窗口中运行它,它执行没有任何问题。
Solved!我设法解决了我遇到的问题。我认为问题是我缺乏线程编程经验。我错过了这样一个事实:当我创建第一个工作线程时,它们将继续存在,直到 python 脚本退出。每次我将新项目放入队列时,我都会错误地创建更多工作线程(我为每个要运行的外部程序批量执行此操作)。因此,当我到达第四个外部应用程序时,我有四个线程同时运行,尽管我以为我只有一个线程。
你也可以使用check_call() https://docs.python.org/3/library/subprocess.html#subprocess.check_call而不是波彭。check_call() https://docs.python.org/3/library/subprocess.html#subprocess.check_call等待命令完成,即使shell=True
然后返回作业的退出代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)