2014-04-11 4 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() 

Любое решение было бы здорово, ТНХ для чтения пост!

Это в массиве хранится как:

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 ... и запустить его. Обратите внимание, что, поскольку вы не указали, я не фиксирую никаких stdout или stderr вывод вообще.
  • для каждой команды в opencv_array, я вызываю run_shell() в отдельном процессе.
  • После этого я звоню join(), чтобы убедиться, что все они закончены.
+0

Спасибо за помощь Hai Vu! –

0

Вы звоните join(), который делает именно то, что:

присоединиться ([таймаут]):
Блок вызывающий поток до процесса которого присоединиться() метод не вызывается, конечен или до тех пор, дополнительный тайм-аут происходит.

0

В данный момент ваш код не будет ничего делать, как вы передаете Process цель, которая является выходом из os.system вызова не является функцией.

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

Здесь var - целое число. Это должна быть функция.

Вы пытаетесь запустить процессы, которые вызывают системные вызовы? Если это так, вы должны обойти модуль многопроцессорности и посмотреть модуль подпроцесса.

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

Смежные вопросы