管道输出时,Python子流程会作为Popen挂起
我已经通过了数十篇“Python子流程挂起”文章,并认为我已经解决了下面代码中各篇文章中提出的所有问题。
我的代码间歇地挂在Popen命令上。 我使用multiprocessing.dummy.apply_async运行4个线程,每个线程启动一个子进程,然后逐行读取输出并将其修改版本打印到标准输出。
def my_subproc():
exec_command = ['stdbuf', '-i0', '-o0', '-e0',
sys.executable, '-u',
os.path.dirname(os.path.realpath(__file__)) + '/myscript.py']
proc = subprocess.Popen(exec_command, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1)
print "DEBUG1", device
for line in iter(proc.stdout.readline, b''):
with print_lock:
for l in textwrap.wrap(line.rstrip(), LINE_WRAP_DEFAULT):
上面的代码从apply_async运行:
pool = multiprocessing.dummy.Pool(4)
for i in range(0,4):
pool.apply_async(my_subproc)
间歇性的子进程将挂subprocess.Popen
,语句“DEBUG1”不打印。 有时候所有的线程都可以工作,有时只有4个工作中的1个工作。
我不知道这表现了Popen已知的任何死锁情况。 我错了吗?
这似乎是与multiprocessing.dummy的不良交互。 当我使用多处理(不是.dummy线程接口)时,我无法重现错误。
链接地址: http://www.djcxy.com/p/77137.html