【发布时间】:2014-11-04 13:06:01
【问题描述】:
希望我的问题足够具体,与我读过的任何其他问题无关。我想使用 subprocess 和 multiprocessing 来连续生成一堆作业并将返回码返回给我。问题是我不想等待(),所以我可以一次生成所有作业,但我确实想知道它何时完成,以便我可以获得返回码。我遇到了这个奇怪的问题,如果我 poll() 它将无法运行。它只是挂在活动监视器中而不运行(我在 Mac 上)。我以为我可以使用观察者线程,但我挂在 q_out.get() 上,这让我相信也许我正在填满缓冲区并陷入僵局。我不知道如何解决这个问题。这基本上就是我的代码的样子。如果有人对如何做到这一点有任何更好的想法,我很乐意完全改变我的方法。
def watchJob(p1,out_q):
while p1.poll() == None:
pass
print "Job is done"
out_q.put(p1.returncode)
def runJob(out_q):
LOGFILE = open('job_to_run.log','w')
p1 = Popen(['../../bin/jobexe','job_to_run'], stdout = LOGFILE)
t = threading.Thread(target=watchJob, args=(p1,out_q))
t.start()
out_q= Queue()
outlst=[]
for i in range(len(nprocs)):
proc = Process(target=runJob, args=(out_q,))
proc.start()
outlst.append(out_q.get()) # This hangs indefinitely
proc.join()
【问题讨论】:
-
有什么特别的理由同时拥有线程和多处理?
-
如果您不打算阅读内容,为什么还要通过管道传输作业的标准输出?根据作业是否产生大量输出,作业可能会简单地阻止写入标准输出。
-
我会调查Multiprocessing Pools。他们有几种不同的方式来同步或异步启动进程,并且检索返回码(通过等待或稍后检查)非常灵活。此外,还有几种方法可以附加在子流程完成时执行的回调。
-
我一定会调查 Pools。这可能是我最终采用的方法。我仍然想知道我在哪里出错只是为了我的理解。感谢到目前为止所有回答的人。
标签: python multithreading multiprocessing subprocess