我使用的是python 2.7
,並且沒有升級或移回subprocess32
的選項。我在一個線程環境中使用它,通常它工作正常,但有時subprocess
創建沒有返回,因此線程掛起,即使strace
在掛起的情況下不起作用,所以我沒有得到任何反饋。子過程不是線程安全的,替代方法?
E.G.這條線可能會導致掛起(返回的數據是小,所以它不是一個管道的問題):
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
我後來讀到子在Python 2.7,並且不是線程安全的「各種問題」,固定成最新版本。我正在使用多個線程調用子進程。
我已經證明了這個問題,下面的代碼(如一個顯而易見的例子 - 不是我的實際代碼),這將啓動多個線程與subprocess
每個:
import os, time, threading, sys
from subprocess import Popen
i=0
class Process:
def __init__(self, args):
self.args = args
def run(self):
global i
retcode = -1
try:
self.process = Popen(self.args)
i+=1
if i == 10:
sys.stdout.write("Complete\n")
while self.process.poll() is None:
time.sleep(1.0)
retcode = self.process.returncode
except:
sys.stdout.write("ERROR\n")
return retcode
def main():
processes = [Process(["/bin/cat"]) for _ in range(10)]
# start all processes
for p in processes:
t = threading.Thread(target=Process.run, args=(p,))
t.daemon = True
t.start()
sys.stdout.write("all threads started\n")
# wait for Ctrl+C
while True:
time.sleep(1.0)
main()
這往往會導致1個或多個subprocess
電話永不返回。有沒有人有關於此或解決方案/替代方案的更多信息
我正在考慮使用棄用的commands.getoutput
來代替,但不知道這是否是線程安全的?它似乎對上面的代碼正確工作。
引用子進程錯誤? –
@JohnZwinck:這是一個:http://bugs.python.org/issue2320(還有更多,他們很容易找到)。 – NPE
FWIW,我個人傾向於使用subprocess32(https://pypi.python.org/pypi/subprocess32/),但它聽起來像它不是您的環境中的選項? – NPE