2012-07-12 83 views
2

我发现了有关python中的多处理和多线程的信息,但我不明白基本概念和我发现的所有示例都比我想要做的更困难。使用python进行基本多处理

我有X个需要运行的独立程序。我想启动第一个Y程序(其中Y是我的计算机的核心数量,X >> Y)。只要其中一个独立程序完成,我希望下一个程序在下一个可用内核中运行。我认为这很简单,但我一直在困扰它。任何帮助解决这个问题将不胜感激。

编辑:非常感谢您的回答。我还发现了另一个使用我想分享的joblib模块的解决方案。假设你有一个名为'program.py'的脚本,你想用不同的输入参数组合(a0,b0,c0)运行,并且你想使用所有的核心。这是一个解决方案。

import os 
from joblib import Parallel, delayed 
a0 = arange(0.1,1.1,0.1) 
b0 = arange(-1.5,-0.4,0.1) 
c0 = arange(1.,5.,0.1) 
params = [] 
for i in range(len(a0)): 
    for j in range(len(b0)): 
     for k in range(len(c0)): 
      params.append((a0[i],b0[j],c0[k])) 

def func(parameters): 
    s = 'python program.py %g %g %g' % parameters[0],parameters[1],parameters[2]) 
    command = os.system(s) 
    return command 

output = Parallel(n_jobs=-1,verbose=1000)(delayed(func)(i) for i in params) 
+0

程序是什么意思?单独的Python脚本?对于Python库来说,如果进程在脚本中作为函数可用,则很方便。 – 2012-07-12 19:04:56

+0

如果它们是真正独立的程序,您可以使用[gridengine](http://gridengine.org/blog/)来处理所有的任务管理。 – 2012-07-12 19:13:57

回答

0

嗨,我是使用对象的QThread从PyQt的 从我的理解,当他运行只能用他自己的变量和PROC你的线程,他无法改变你的主要对象变量 所以之前运行它是河畔定义所有的QThread变量,你将需要

像这样的例子:

class worker(QThread) 
def define(self, phase): 
    print 'define' 
    self.phase=phase 

    self.start()#will run your thread 
def continueJob(self): 
    self.start() 
def run(self): 
    self.launchProgramme(self.phase) 
    self.phase+=1 
def launchProgramme(self): 
    print self.phase 

我不是非常了解的是如何工作的基本的Python线程,但在PyQt的你的线程启动信号 你的主要目标是这样的:

class mainObject(QtGui.QMainWindow) 
    def __init__(self): 
     super(mcMayaClient).__init__() 
     self.numberProgramme=4 
     self.thread = Worker() 
    #create 
     self.connect(self.thread , QtCore.SIGNAL("finished()"), self.threadStoped) 
     self.connect(self.thread , QtCore.SIGNAL("terminated()"), self.threadStopped) 

连接这样,当thread.run停止,就会启动threadStopped PROC在你的主要目标,其中u能得到你的线程变量的值

def threadStopped(self): 
    value=self.worker.phase 
    if value<self.numberProgramme: 
     self.worker.continueJob() 

之后,你只需要lauch另一个线程或取决于你得到的值 这是pyqt线程,当然,在python基本线程中,执行def线程的方式可能不同。

2

您想要使用multiprocessing.Pool,它代表工作的“工作人员”(默认每个核心一个,但您可以指定另一个数字)。然后您将作业提交给池,并且工人在可用时处理它们。最简单的函数是Pool.map,它为传递序列中的每个参数运行给定的函数,并返回每个参数的结果。如果你不需要返回值,你也可以在循环中使用apply_async

def do_work(arg): 
    pass # do whatever you actually want to do 

def run_battery(args): 
    # args should be like [arg1, arg2, ...] 
    pool = multiprocessing.Pool() 
    ret_vals = pool.map(do_work, arg_tuples) 
    pool.close() 
    pool.join() 
    return ret_vals 

如果你想调用外部程序,而不仅仅是Python函数,使用subprocess。例如,如果返回代码不为0,则会调用cmd_name,并返回输出:

def do_work(subproc_args): 
    return subprocess.check_output(['cmd_name'] + list(subproc_args))