我正在使用python的多处理库对多个进程进行蒙特卡洛模拟.进程基本上会猜测某个对象,如果满足某些条件,它将被添加到共享列表中.如果此列表满足某些条件,我的计算就完成了.我当前的代码如下所示:(伪代码,没有不重要的...

我正在使用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()的事情也可以.
解决方法:
由于您拥有包含所有子流程列表的原始流程,因此为什么不使用该流程终止流程?我在想像这样的东西:
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:
沃梦达教程
本文标题为:Python Multiprocessing:向所有进程发出事件信号的最快方法?


基础教程推荐
猜你喜欢
- Linux系统下python代码运行shell命令的方法 2023-09-03
- 是否有一个可以填充本机Windows表单字段的python模块? 2023-11-12
- 如何使用python生成大量数据写入es数据库并查询操作 2022-10-20
- Python matplotlib绘图建立画布及坐标系 2023-08-04
- python中for循环的多种使用实例 2022-10-20
- Python平均数 2023-10-08
- 进程与子进程(python3入门) 2023-09-04
- 转:ubuntu16安装python3.6并将环境设置为系统默认 2023-09-03
- Linux编译opencv python错误:ImportError:libjasper.so.1 2023-11-11
- 【网站】python的Windows平台的扩展包 2023-09-03