python - 如何在subprocess.Popen.communicate()中释放GIL

标签 python python-2.7

我有 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/

相关文章:

Python lxml : how to get human-readable XPath for XML element?

python - 如何根据另一个变量的值调用列表中的元素?

python - 是否可以在不使用for循环的情况下将矩阵A中的所有列与矩阵B中的每一列相乘?

python - win32com 获取可用应用程序列表

python - 需要帮助修复我的 RK4 实现

python - 无法同步数据库

python - 如果您不知道日期输入的格式,如何格式化日期字符串?

python - 如何在spyder中添加 "new line"键盘快捷键

Python 内部缓冲输出

python - 如何从网页中提取单个元素?