我有 2 个 threading.Thread
,每个调用:
p = subprocess.Popen(...)
o,e = p.communicate()
调用p.communicate()
时,似乎没有释放GIL
。在上面的代码中,线程变成管道化的,只有当第一个线程完成时,第二个线程才能启动,这不是所需的行为。
有没有办法以释放GIL
的方式等待Popen
?
最佳答案
使用多处理
模块而不是线程
。
看简介第一句https://docs.python.org/2/library/multiprocessing.html .
或者,如果您仍然想使用线程,请不要调用 communicate()
,而是使用 stdin 和 stdout 管道。您仍然必须小心,因为您可能会无意中以这种方式锁定进程。例如,如果您在没有可用数据时尝试从进程的 stdout
读取数据,就会发生这种情况。您必须确切地知道数据何时可用,以及有多少字节可用(这不完全是轮询)。
p = subprocess.Popen( ..., stdin=subprocess.PIPE, stdout=subprocess.PIPE )
p.stdin.write( ... )
n = 1
x = p.stdout.read(n) # this will lock if less than N bytes are available
关于python - 如何在subprocess.Popen.communicate()中释放GIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35640929/