我正在使用 python 的多处理库对多个进程进行蒙特卡罗模拟。这些进程基本上猜测某个对象,如果它满足某些条件,则将其添加到共享列表中。如果这个列表满足某些条件,我的计算就完成了。
我当前的代码如下所示:(没有不重要细节的伪代码)
mgr = Manager()
ns = mgr.Namespace()
ns.mylist = []
ns.othersharedstuff = x
killsig = mgr.Event()
processes = [ MyProcess(ns, killsig) for _ in range(8) ]
for p in processes: p.start()
for p in processes: p.join()
get data from ns.mylist()
def MyProcess.run(self):
localdata = y
while not killsig.is_set():
x = guessObject()
if x.meetsCondition():
add x to ns.mylist and put local data into ns()
if ns.mylist meets condition:
killsig.set()
put local data into ns()
当我将 'while not killsig.is_set():' 替换为 'while True:' 时,我的模拟速度提高了大约 25%!(当然,除非它不再终止)
有没有比使用信号更快的方法?每个进程的未同步本地数据是否丢失并不重要,因此涉及 process.terminate() 的东西也可以。