Python多处理:向所有进程发出事件信号的最快方法?

Posted

技术标签:

【中文标题】Python多处理:向所有进程发出事件信号的最快方法?【英文标题】:Python Multiprocessing: Fastest way to signal an event to all processes? 【发布时间】:2012-04-29 05:44:17 【问题描述】:

我正在使用 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() 的东西也可以。

【问题讨论】:

【参考方案1】:

既然您拥有包含所有子进程列表的原始进程,为什么不使用它来终止进程呢?我正在想象这样的事情:

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多处理:向所有进程发出事件信号的最快方法?的主要内容,如果未能解决你的问题,请参考以下文章

linux 信号处理

QT中的信号与事件,多线程

向同一进程中的另一个线程发出信号

python进程同步控制,信号量,事件

C UNIX 多进程间信号量同步

Python多进程,同步互斥,信号量,锁补充上一篇文章