これに相当するマルチプロセッシングを使用する簡単な方法はありますか? sim_listの要素は「シミュレーション」オブジェクト、実行()であるPythonマルチプロセッシング - オブジェクトのリストにクラスメソッドを適用する
for sim in sim_list:
sim.run()
はをは、オブジェクトの属性を変更しないシミュレーションクラスのメソッドです。たとえば、
class simulation:
__init__(self):
self.state['done']=False
self.cmd="program"
def run(self):
subprocess.call(self.cmd)
self.state['done']=True
sim_listのすべてのsimは独立しているので、戦略はスレッドセーフである必要はありません。
私は以下のことを試みました。これは、引数がdeepcopyによって渡され、インプレースで変更されていないため、明らかに欠陥があります。あなたがやりたい
from multiprocessing import Process
for sim in sim_list:
b = Process(target=simulation.run, args=[sim])
b.start()
b.join()
ループ内のプロセスにjoin()したくない場合や、パラレルではなく、順番にプロセスを実行する場合があります。あなたの質問に答えるために、プロセスを開始するときにマルチプロセッシングとキューオブジェクトを送信し、完了したらキューに自分自身を置くことができます。 –
join()についてのコメントはありません。キューの使用に関しては、どのように動作するはずです。私のsimオブジェクトは、とにかくdeepcopyを通過するつもりはありませんか? – calys
@calys Windowsでは、メソッドをpickleしようとしているため、PicklingErrorを取得します。UNIXでは、「deepcopy」はありません。単に各プロセスが完全なアドレス空間の完全なコピーを取得します。いくつかの明示的なプロセス間通信によって、インスタンス内の状態の変化を置き換える必要があります。 @Bakuriuありがとうございます。 – Bakuriu