是否有一種簡單的方法可以使用多處理來做到這一點?Python多處理 - 將類方法應用於對象列表
for sim in sim_list:
sim.run()
其中sim_list的元素是「模擬」對象和運行()是模擬類不修改對象的屬性的方法。例如:
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都是獨立的,所以策略不必是線程安全的。
我嘗試了以下內容,這顯然有缺陷,因爲參數是通過深層複製傳遞的,並且未就地進行修改。
from multiprocessing import Process
for sim in sim_list:
b = Process(target=simulation.run, args=[sim])
b.start()
b.join()
你不想在循環中加入()你的進程,或者你將一個接一個地運行它們,而不是並行運行它們。要回答您的問題,您可以在啓動進程時發送multiprocessing.Queue對象,然後在完成時將自己放入隊列中。 –
好的關於join()的評論。關於Queue的使用,我不確定這應該如何工作。無論如何,我的SIM卡對象是否會通過深層複製傳遞? – calys
@calys在windows上,你會得到一個'PicklingError',因爲你試圖醃製一個方法,在UNIX上沒有「deepcopy」,簡單地說每個進程都獲得整個地址空間的完美副本。您必須通過某些明確的進程間通信來替換實例中的狀態更改。 – Bakuriu