我正在使用多处理做一些非常简单的事情:
data = {'a': 1}
queue.put(data, True)
data.clear()
当我在另一个进程上使用队列时(使用get()
方法),我得到一个空字典。如果我删除data.clear()
,我会按预期获得密钥。有没有办法等待put()
完成序列化?
答案 0 :(得分:9)
实际上,这被认为是一个特征,而不是问题。 队列会立即返回,以便在序列化发生时继续您的流程并避免所谓的“queue contention”。
我建议你有两个选择:
您是否绝对确定首先需要可变的词典?为什么不创建一个新的字典而不是使用dict.clear()
而让垃圾收集器担心旧字典?而不是制作数据的防御性副本(你似乎不喜欢它)?
自己挑选数据;即:a_queue.put(pickle.dumps(data))
和pickle.loads(a_queue.get())
。现在,如果您在data.clear()
后执行put
,则数据已经由您“序列化”。
从并行编程的角度来看,第一种方法(将数据看作是不可变的)是长期更可行和干净的事情,但我不确定是否或为什么必须清除你的词典
答案 1 :(得分:2)
最好的方法可能是在发送前复制data
。尝试:
data = {'a': 1}
dc = data.copy()
queue.put(dc)
data.clear()
基本上,在字典被清除之前你不能指望发送完成,所以你不应该尝试。当dc
超出范围或再次执行代码时,它将被垃圾收集。