"Published" Python 中跨进程可访问的值



我正在用python(3.7(编写软件,它涉及一个主GUI线程和多个子进程,每个子进程都作为状态机运行。

我希望子进程发布其当前状态机状态名称,以便主 GUI 线程可以检查状态机所处的状态。

我想找到一种方法来做到这一点,这样如果主进程和子进程同时尝试读取/写入状态变量,主进程将立即(没有锁定/等待(获得稍微过时的状态,子进程将立即(没有锁定/等待(将当前状态写入状态变量。

基本上,我想确保子进程不会因为同时访问状态变量而出现任何延迟/抖动,并且我不在乎 GUI 是否获得稍微过时的值。

我调查了:

  • 使用maxsize1queue.Queue,但行为queue.Queue是在队列空间不足时阻止 - 它会 为我的目的工作,如果它表现得像一个collections.deque和 默默地让最老的价值走木板,如果有一个新的进来 没有可用空间。
  • 使用multiprocessing.Value,但从 文档,听起来您需要获取锁才能 访问或写入值,这就是我想避免的 - 不 锁定/阻止同时读取/写入。它说了些什么 含糊其辞,如果你不使用锁,它就不是"过程安全的", 但我真的不知道这意味着什么 - 什么坏事会 完全不使用锁发生?

实现这一目标的最佳方法是什么?谢谢!

出于某种原因,我忘记了可以以非阻塞方式put队列!

我找到的解决方案是使用带有maxsize=1multiprocessing.Queue,并在生产者(子进程(端使用非阻塞写入。以下是我所做的事情的简短版本:

在父进程中初始化:

import multiprocessing as mp
import queue
publishedValue = mp.Queue(maxsize=1)

在重复调度的 GUI 函数("使用者"(中:

try:
# Attempt to get an updated published value
publishedValue.get(block=False)
except queue.Empty:
# No new published value available
pass

在子"生产者"过程中:

try:
# Clear current value in case GUI hasn't already consumed it
publishedValue.get(block=False)
except queue.Empty:
# Published value has already been consumed, no problem
pass
try:
# Publish new value
publishedValue.put(block=False)
except queue.Full:
# Can't publish value right now, resource is locked
pass

请注意,这确实要求子进程可以在值被阻止时重复尝试重新发布值,否则使用者可能会完全错过已发布的值(而不是简单地延迟一点(。

我认为这可能以更简洁的方式(并且可能开销更少(通过对multiprocessing.Value对象而不是队列进行非阻塞写入,但文档并没有明确说明(对我来说(如何做到这一点。

希望这对某人有所帮助。

相关内容

  • 没有找到相关文章

最新更新