我在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 :(得分: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))
答案 1 :(得分: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,你可以在那里得到你的线程值Variables
def threadStopped(self):
value=self.worker.phase
if value<self.numberProgramme:
self.worker.continueJob()
之后你只需要另外一个线程,取决于你获得的价值 这对于pyqt线程当然,在python基本线程中,执行def threadStopped的方式可能不同。