【发布时间】:2014-11-25 03:24:33
【问题描述】:
我需要使用 Popen 运行一个较长的 foobar.py 进程,并使用 multiprocessing 进程解析其输出。
我的问题是有时我不能等待解析器完成,所以我需要使用the multiprocessing daemon property 守护解析器。我需要解析器能够以两种非守护方式使用。该文档还说不允许一个守护进程创建子进程。因此,在这种情况下,我会在解析器分叉之前运行 Popen 进程(请参阅下面的启动方法)。
class Parser(multiprocessing.Process):
def __init__(self, daemon, output):
super(Parser, self).__init__()
self.daemon = daemon
self.output = output
def start(self):
if self.daemon:
self.launchFoobar() # Foobar is launched before forking
super(Parser, self).start()
def run(self):
if not self.daemon:
self.launchFoobar() # Foobar is launched after forking
self.parseFoobar()
def launchFoobar(self):
self.process = subprocess.Popen(["python", "foobar.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
def parseFoobar(self):
with open(self.output, "w+") as f:
for line in iter(self.process.stdout):
f.write(line)
f.flush()
self.process.wait()
假设foobar.py 只是等待几秒钟并打印一些东西,而 parseFoobar 方法只是在文件中打印输出。就我而言,这两个函数都比这复杂得多。
运行Parser(daemon=False, "sync.txt").start() 工作正常,sync.txt 中有一些输出。但是运行 Parser(daemon=True, "async.txt") 不会在 async.txt 中产生任何内容,并且似乎在 for line in iter(self.process.stdout): 行被阻止,因为该文件已创建,但它是空的。
为什么它不起作用?我该如何解决?
您可以找到parser.py 和foobar.py 的要点进行测试。只需运行 python parser.py 并查看输出文件。
编辑:django daemonize methods中有一些提示
【问题讨论】:
标签: python multiprocessing subprocess popen python-multiprocessing