当前位置: 首页 > 面试题库 >

Windows上的Python-如何等待多个子进程?

司寇阳朔
2023-03-14
问题内容

如何在Windows上的Python中等待多个子进程,而无需主动等待(轮询)?这样的事情 几乎 对我有用:

proc1 = subprocess.Popen(['python','mytest.py'])
proc2 = subprocess.Popen(['python','mytest.py'])    
proc1.wait()
print "1 finished"
proc2.wait()
print "2 finished"

问题是,当proc2之前完成时proc1,父进程仍将等待proc1。在Unix上,人们会waitpid(0)在循环中使用它们来获取子进程的返回代码,这些代码在完成时如何在Windows上的Python中实现类似功能?


问题答案:

可能看起来有些矫kill过正,但是,在这里:

import Queue, thread, subprocess

results= Queue.Queue()
def process_waiter(popen, description, que):
    try: popen.wait()
    finally: que.put( (description, popen.returncode) )
process_count= 0

proc1= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
    (proc1, "1 finished", results))
process_count+= 1

proc2= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
    (proc2, "2 finished", results))
process_count+= 1

# etc

while process_count > 0:
    description, rc= results.get()
    print "job", description, "ended with rc =", rc
    process_count-= 1


 类似资料:
  • 问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。

  • 我正在尝试将bash脚本迁移到Python。 bash脚本并行运行多个OS命令,然后在继续之前等待它们完成,即: 命令 我希望使用Python子进程实现同样的目标。这可能吗?如何等待subprocess.call命令完成后再继续?

  • 如果你想等待 process::Child 完成,就必须调用 Child::wait,这会返回一个 process::ExitStatus。 use std::process::Command; fn main() { let mut child = Command::new("sleep").arg("5").spawn().unwrap(); let _result = chi

  • 我在blender中有一个python脚本 我试着用通勤,但还是没用: 此shell脚本在MacOS上非常有效(在更改路径后),并且在使用时会等待 但是在Windows上,我在Blender中运行下面的python脚本,然后一旦它到达子进程行就会打开并运行shell脚本,而Blender不等待它完成,它只在控制台中打印而不等待Git Bash完成。有人帮忙吗?

  • 问题内容: 请考虑以下代码片段: 这是在小程序中添加一个标签,该标签显示了Worker线程的一些中间结果(使用发布/处理方法)。最后,标签从小程序的窗格中删除。我的问题是,如何创建多个标签,每个标签都有自己的Worker线程,并在完成标签后将其删除? 提前致谢。 更新: 我希望这可以澄清我的问题。我希望在所有工作人员都完成任务后立即删除所有标签,而不是在每个工作人员都完成之后立即删除。 更新2:

  • 请考虑以下代码片段: 下面是向小程序添加一个标签,该标签显示工作线程的一些中间结果(使用发布/处理方法)。最后,标签将从小程序的窗格中移除。我的问题是,我如何创建几个标签,每个标签都有自己的工作线程,并在全部完成后删除它们? 提前感谢。 更新: 我希望这能澄清我的问题。我希望在所有工人完成任务后,而不是在每个工人完成任务后立即移除所有标签。 更新2: 下面的代码似乎正在做我需要的事情。请评论我的做