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”。
我建议你有两个选择:
您绝对确定首先需要可变字典吗?为什么不创建一个新字典而不是使用 dict.clear()
并让垃圾收集器担心旧字典,而不是创建一个你似乎不喜欢的防御性副本?
自己腌制数据;即:a_queue.put(pickle.dumps(data))
和 pickle.loads(a_queue.get())
。现在,如果您在 put
之后执行 data.clear()
,则数据已经序列化 "by you".
从并行编程的角度来看,第一种方法(将您的数据视为不可变的)从长远来看是更可行和干净的事情,但我不确定您是否或为什么必须清除你的字典。
我正在使用多处理做一些非常简单的事情:
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”。
我建议你有两个选择:
您绝对确定首先需要可变字典吗?为什么不创建一个新字典而不是使用
dict.clear()
并让垃圾收集器担心旧字典,而不是创建一个你似乎不喜欢的防御性副本?自己腌制数据;即:
a_queue.put(pickle.dumps(data))
和pickle.loads(a_queue.get())
。现在,如果您在put
之后执行data.clear()
,则数据已经序列化 "by you".
从并行编程的角度来看,第一种方法(将您的数据视为不可变的)从长远来看是更可行和干净的事情,但我不确定您是否或为什么必须清除你的字典。