2012-07-12 131 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))