2017-09-29 95 views
0

我已经通过了几十个这里的“Python子流程挂起”文章,并认为我已经解决了下面代码中各种文章中提出的所有问题。当管道输出时,Python子流程像Popen一样挂起

我的代码间歇性地挂在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已知的任何死锁情况。我错了吗?

回答

0

这似乎是与multiprocessing.dummy的不良交互。当我使用多处理(不是.dummy线程接口)时,我无法重现错误。