2014-04-11 144 views
0

我有關於執行命令並在同一時間全部威脅它們的問題。Python多重處理

更好的解釋: 我有一個數組,約20個功能,準備運行在終端。

功能:
opencv_haartrainer -vec - >等一個...

我怎麼能執行所有20個功能,在同一時間運行呢?

我的代碼如下所示:

import multiprocessing 
from multiprocessing import Process 

# Array of processes 
opencv_array = [] 

def multiprocessing_on(): 
    # Multiprocessing on shell execute command 
    a = [i**3 for i in range (4)] 
    for proc in opencv_array: 
     var = os.system(proc) 
     var += 1 
     task = [Process(target = var, args = (i,)) for i in a] 

    # Call process 
    for each in task: 
     each.start() 
    # Join process 
    for each in task: 
     each.join() 

multiprocessing_on() 

任何解決方案將是巨大的,THX閱讀帖子!

這在陣列存儲,如:

opencv_haartraining -data data -vec mil.vec 
     -bg data.txt -nstages 13 -nsplits 4 
     -minhirate 0.999 -maxfalsealarm 0.5 
     -npos 41 -nneg 3019 -w 24 -h 24 
     -nonsym -mem 2048 -mode ALL 

它就像在陣列20個不同haartraingin,什麼我想要在同一時間通過使用os.system執行它們。

+2

你沒有說出什麼問題。 – bosnjak

+0

我的代碼首先從數組中取出並開始處理。我如何從數組中獲取所有值並在同一時間處理它們。 –

+0

我不明白:你的代碼先拿什麼?你能舉個例子來說明'opencv_array'的樣子嗎? –

回答

2

這是我的想法。而不是使用os.system(),我使用subprocess,它允許更好的控制。

from multiprocessing import Process 
import subprocess 

def run_shell(command): 
    p = subprocess.Popen(command) 
    p.communicate() 

# Array of processes 
opencv_array = [ 
    'opencv_haartraining -data data -vec mil.vec ...', 
    'opencv_haartraining -data data -vec mil.vec ...', 
] 

def multiprocessing_on(): 
    tasks = [] 
    for command in opencv_array: 
     task = Process(target=run_shell, args=(command,)) 
     task.start() 
     tasks.append(task) 

    # Wait for all done 
    for task in tasks: 
     task.join() 

multiprocessing_on() 

探討
  • 我創建了一個稱爲run_shell()簡單的程序,它採取如opencv_haartraining -data data ...一個命令並運行它。請注意,因爲您沒有指定,我根本沒有捕獲任何標準輸出stderr輸出。
  • 對於opencv_array中的每個命令,我在單獨的過程中調用run_shell()
  • 之後,我打電話join()確保他們都完成了。
+0

感謝您的幫助Hai Vu! –

0

要調用join(),這正是這麼做的:

加入([超時])
阻塞調用線程,直到其 join()方法被調用終止或直到進程發生可選超時 。

0

此刻你的代碼不會做任何事情,因爲你正在傳遞Process的目標是一個os.system調用的輸出不是一個函數。

Process(target = var, args = (i,)) 

這裏var是一個整數。它應該是一個功能。

您是否試圖啓動進行系統調用的進程?如果是這樣,您應該繞過多處理模塊並查看子進程模塊。

https://docs.python.org/2/library/subprocess.html