Python 多处理队列 put() 行为

Python multiprocessing Queue put() behavior

我正在使用多处理做一些非常简单的事情:

data = {'a': 1}
queue.put(data, True)
data.clear()

当我在另一个进程上使用队列时(使用 get() 方法),我得到一个空字典。如果我删除 data.clear() 我会按预期获得密钥。有没有办法等待 put() 完成序列化?

最好的方法可能是在发送前复制 data。尝试:

data = {'a': 1}
dc = data.copy()
queue.put(dc)
data.clear()

基本没法指望在清空字典前发送完成,所以还是不要尝试了。 dc 超出范围或再次执行代码时将被垃圾回收。

实际上,这被认为是一个特性,而不是一个问题。 队列立即 returns 以便您的进程在序列化发生时继续进行并避免所谓的“queue contention”。

我建议你有两个选择:

  1. 您绝对确定首先需要可变字典吗?为什么不创建一个新字典而不是使用 dict.clear() 并让垃圾收集器担心旧字典,而不是创建一个你似乎不喜欢的防御性副本?

  2. 自己腌制数据;即:a_queue.put(pickle.dumps(data))pickle.loads(a_queue.get())。现在,如果您在 put 之后执行 data.clear(),则数据已经序列化 "by you".

从并行编程的角度来看,第一种方法(将您的数据视为不可变的)从长远来看是更可行和干净的事情,但我不确定您是否或为什么必须清除你的字典。