我正在使用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():'with'while True:'替换时,我的模拟速度提高了约25%! (当然,除了它不再终止)
有没有比使用信号更快的方法?如果每个进程的非同步本地数据丢失并不重要,那么涉及process.terminate()的内容也可以。
答案 0 :(得分:3)
由于您的原始进程包含所有子进程的列表,为什么不使用它来终止进程?我正在想象这样的事情:
ns.othersharedstuff = x
killsig = mgr.Event()
processes = [ MyProcess(ns, killsig) for _ in range(8) ]
for p in processes: p.start()
while not killsig.isSet():
time.sleep(0.01) # 10 milliseconds
for p in processes: p.terminate()
get data from ns.mylist()
然后你可以将while循环设置为while true: