2

我在 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)
4

2 回答 2

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. 例如,这将cmd_name使用传递的参数列表进行调用,如果返回码不为 0,则引发异常,并返回输出:

def do_work(subproc_args):
    return subprocess.check_output(['cmd_name'] + list(subproc_args))
于 2012-07-12T20:23:51.250 回答
0

嗨,我正在使用来自 pyqt 的对象 QThread 据我了解,您的线程在运行时只能使用他自己的变量和 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,您可以在其中获取线程变量的值

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

之后,您只需要根据您获得的值启动另一个线程,这当然是用于 pyqt 线程,在 python 基本线程中,执行 def threadStopped 的方式可能会有所不同。

于 2012-07-12T20:08:18.040 回答