2014-04-11 146 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