2015-03-02 34 views
0

我無法在等待終止的情況下同時啓動多個進程。在無需等待的情況下啓動python中的多個進程

我正在遍歷目錄,然後在外部腳本中處理文件的內容。

命令行執行看起來像以下:

python process.py < /dir/file 

這裏是Python代碼

for root, directory, file in os.walk(dir): 
    for name in file: 
     input_file = open(os.path.join(root, name)) 
     input_text = input_file.read().encode('utf-8') 
     input_file.close() 

     command = "python process.py" 
     process = subprocess.Popen(command.split(), shell=False, stdin=subprocess.PIPE) 
     process.stdin.write(input_text) 
     log.debug("Process started with pid {0}".format(process.pid)) 
     process.communicate() 

一些樣本是否有任何的方式開始他們無需等待終止?

回答

2

是的。將它們存儲在列表中,並且不要在循環中使用process.communicate()。它阻止。

從文檔:

與互動的過程:將數據發送至標準輸入。從stdout和stderr中讀取數據,直到達到文件結尾。 等待進程終止。可選的輸入參數應該是要發送到子進程的字符串,如果沒有數據應該發送給子進程,則爲None。

所以結果應該是這樣的:

# list to store processes after creating them 
prcoesses = list() 

for root, directory, file in os.walk(dir): 
    for name in file: 
     input_file = open(os.path.join(root, name)) 
     input_text = input_file.read().encode('utf-8') 
     input_file.close() 

     command = "python process.py" 
     process = subprocess.Popen(command.split(), 
            shell=False, 
            stdin=subprocess.PIPE) 
     processes.append(process) 

     process.stdin.write(input_text) 
     log.debug("Process started with pid {0}".format(process.pid)) 
     # process.communicate() 

# wait for processes to complete 
for process in processes: 
    stdoutdata, stderrdata = process.communicate() 
    # ... do something with data returned from process 

爲了有可能要使用process pool這是可以通過multiprocessing模塊處理數量有限。

+0

如果我把所有processessess放在列表上,但是你有什麼辦法控制正在運行的進程的數量,我的意思是如果我有50個文件需要處理,但是我一次只需要10個文件? – user2847238 2015-03-03 08:29:50

+1

google「python multiprocessing」 – 2015-03-03 08:39:03

+0

謝謝,經過一番爭鬥,我找到了解決方案,如何從Pool運行進程。仍然沒有管理如何在Pool上進行懶惰迭代。 – user2847238 2015-03-03 13:20:24

相關問題