首页 > 解决方案 > Python多线程/多处理断言所有进程在继续之前已同步和暂停

问题描述

我的主应用程序产生了几个子进程或线程。这个数字是可变的,进程/线程可以随时完成。在大多数情况下,孩子们可以正常跑步。但是,在某些时候,我需要能够在给定时刻暂停所有活着的孩子,并确保他们在继续之前都处于同一点。

这正是我需要在主脚本中实现的:

  1. 数一数还活着的孩子的数量。
  2. 暂停所有活着的孩子。
  3. 确认所有活着的孩子确实在我需要他们的地方暂停(而不是陷入长时间的计算)。
  4. 当所有孩子都同步并暂停时,进行一些处理和保存。
  5. 释放所有孩子继续。

threading似乎没有一个同步原语可以满足我的所有需求。我的一些想法:

  1. Event所有孩子的对象。这满足了我的大部分需求,但我无法检查孩子是否确实在等待Event. 似乎没有Event.poll()方法或类似的方法。
  2. 使用Barrier. 这似乎具有我需要的几乎所有元素,但是,就等待方的数量和Barrier所有线程的发布而言,它是不可变的,而不仅仅是主线程。我想到了一个 hacky 解决方法,当我等待的号码正确reset()时,主要呼叫。n_waiting这会导致等待的孩子用BrokenBarrierException我可以抓住的 a 释放等待。这似乎很hacky。
  3. 我还考虑过使用Semaphorewhere 主脚本调用acquire()来捕获与孩子竞争的所有允许的连接,并且只有在收集了所有可能的连接后,主脚本才能继续。这涉及更改其_value属性以匹配子项的数量,但是这是不安全的。

有没有正确和安全的方法来做我要求的事情?

标签: pythonmultithreadingmultiprocessingsynchronization

解决方案


推荐阅读