16

マルチプロセッシングを使用してこれと同等のことを行う簡単な方法はありますか?

for sim in sim_list:
  sim.run()

ここで、sim_list の要素は「シミュレーション」オブジェクトであり、run() はオブジェクトの属性を変更するシミュレーション クラスのメソッドです。例えば:

class simulation:
    def __init__(self):
        self.state['done']=False
        self.cmd="program"
    def run(self):
        subprocess.call(self.cmd)
        self.state['done']=True

sim_list 内のすべての sim は独立しているため、戦略はスレッドセーフである必要はありません。

私は次のことを試しましたが、引数がディープコピーによって渡され、その場で変更されていないため、明らかに欠陥があります。

from multiprocessing import Process

for sim in sim_list:
  b = Process(target=simulation.run, args=[sim])
  b.start()
  b.join()
4

2 に答える 2

15

あなたが望むことをする1つの方法は、コンピューティングクラス(simulationあなたの場合)を のサブクラスにすることですProcess。適切に初期化されると、このクラスのインスタンスは個別のプロセスで実行され、必要に応じてリストからそれらのグループを設定できます。

上で書いたものに基づいて作成した例を次に示します。

import multiprocessing
import os
import random

class simulation(multiprocessing.Process):
    def __init__(self, name):
        # must call this before anything else
        multiprocessing.Process.__init__(self)

        # then any other initialization
        self.name = name
        self.number = 0.0
        sys.stdout.write('[%s] created: %f\n' % (self.name, self.number))

    def run(self):
        sys.stdout.write('[%s] running ...  process id: %s\n' 
                         % (self.name, os.getpid()))

        self.number = random.uniform(0.0, 10.0)
        sys.stdout.write('[%s] completed: %f\n' % (self.name, self.number))

次に、オブジェクトのリストを作成し、それぞれをループで開始します。

sim_list = []
sim_list.append(simulation('foo'))
sim_list.append(simulation('bar'))

for sim in sim_list:
    sim.start()

これを実行すると、各オブジェクトが独自のプロセスで実行されることがわかります。Process.__init__(self)クラスの初期化の最初に、何よりも先に呼び出すことを忘れないでください。

明らかに、この例にはプロセス間通信は含まれていません。状況で必要な場合は、それを追加する必要があります(必要かどうかは質問から明確ではありませんでした)。

このアプローチは私にとってはうまく機能し、欠点は認識していません。私が見落としている隠れた危険を知っている人がいたら、教えてください。

これが役立つことを願っています。

于 2013-04-24T21:19:53.180 に答える
2

大規模なデータ セットを使用する場合は、次のiterableソリューションが適しています。

import multiprocessing as mp
pool = mp.Pool(mp.cpu_count())
pool.imap(sim.start, sim_list)
于 2019-08-14T06:24:55.593 に答える