python的基本多处理

2024-04-27 04:44:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中找到了关于多处理和多线程的信息,但是我不理解基本概念,而且我发现的所有示例都比我要做的更困难。在

我有X个独立程序需要运行。我想启动第一个Y程序(其中Y是计算机的核心数,X>;Y)。一旦其中一个独立程序完成,我希望下一个程序在下一个可用的内核中运行。我原以为这会很简单,但我一直坚持下去。如果能帮助解决这个问题,我们将不胜感激。在

编辑:非常感谢你的回答。我还找到了另一个解决方案,使用joblib模块,我想与大家分享。假设你有一个脚本叫做'程序.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)

Tags: in程序核心forlenrangeparams解决方案
2条回答

嗨,我在用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中,线程会发出一个信号 你的主要目标是:

^{pr2}$

像这样连接,当线程运行stop,它将在主对象中启动threadStopped proc,在这里可以获得线程变量的值

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

之后,您只需启动另一个线程或不取决于您得到的值 当然,在pyqt线程中,执行def threadStopped的方法可能不同。在

您想要使用^{},它代表一个“池”的工人(默认每个核心一个,但您可以指定另一个数字)来做您的工作。然后将作业提交到池中,工作人员在作业可用时处理它们。最容易使用的函数是^{},它为传递序列中的每个参数运行给定函数,并返回每个参数的结果。如果不需要返回值,也可以在循环中使用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函数,请使用^{}。例如,这将使用传递的参数列表调用cmd_name,如果返回代码不是0,则引发异常,并返回输出:

^{pr2}$

相关问题 更多 >