Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python进行基本的多处理_Python_Multithreading_Multiprocessing - Fatal编程技术网

使用python进行基本的多处理

使用python进行基本的多处理,python,multithreading,multiprocessing,Python,Multithreading,Multiprocessing,我在python中找到了关于多处理和多线程的信息,但我不理解基本概念,而且我发现的所有示例都比我要做的更难 我需要运行X个独立的程序。我想启动第一个Y程序(其中Y是我的计算机的内核数,X>>Y)。一旦其中一个独立程序完成,我希望下一个程序在下一个可用的内核中运行。我原以为这会很简单,但我一直在坚持。如果您能帮助解决这个问题,我们将不胜感激 编辑:非常感谢你的回答。我还发现了另一个使用joblib模块的解决方案,我想与大家分享。假设您有一个名为“program.py”的脚本,希望使用不同的输入参数

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

嗨,我正在使用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进程,您可以从中获取线程变量的值

def threadStopped(self):
    value=self.worker.phase
    if value<self.numberProgramme:
        self.worker.continueJob()
def threadStopped(自):
值=self.worker.phase
如果要使用值,则表示执行作业的工作人员的“池”(默认为每个核心一个,但您可以指定另一个数字)。然后将作业提交到池中,工人在作业可用时处理作业。最容易使用的函数是,它为传递序列中的每个参数运行给定函数,并返回每个参数的结果。如果不需要返回值,还可以在循环中使用
apply\u 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,则引发异常,然后返回输出:

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

你说的程序是什么意思?单独的python脚本?对于Python库来说,如果进程可以作为脚本中的函数使用,则非常方便。如果它们是真正独立的程序,则可以使用来处理所有任务管理。