2

Python でのマルチプロセッシングとマルチスレッドに関する情報を見つけましたが、基本的な概念が理解できず、見つかったすべての例は、私がやろうとしていることよりも難しいものです。

実行する必要がある X 個の独立したプログラムがあります。最初の Y 個のプログラムを起動したい (ここで、Y はコンピューターのコア数で、X>>Y)。独立したプログラムの 1 つが完了するとすぐに、次のプログラムを次に利用可能なコアで実行したいと考えています。これは簡単だと思っていましたが、行き詰まっています。この問題を解決するための助けをいただければ幸いです。

編集:回答ありがとうございます。また、共有したい joblib モジュールを使用した別のソリューションも見つけました。入力パラメーター (a0、b0、c0) のさまざまな組み合わせで実行する「program.py」というスクリプトがあり、すべてのコアを使用するとします。これは解決策です。

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ます (デフォルトではコアごとに 1 つですが、別の数を指定できます)。その後、ジョブをプールに送信すると、ワーカーは使用可能になったときにジョブを処理します。最も簡単に使用できる関数は です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 プロシージャが起動されます。

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

その後、別のスレッドを起動するか、取得した値に依存する必要はありません。もちろん、これは pyqt スレッド用です。python 基本スレッドでは、def threadStopped を実行する方法が異なる場合があります。

于 2012-07-12T20:08:18.040 に答える