Python多处理队列put()行为

时间:2015-02-18 20:18:43

标签: python queue multiprocessing python-multithreading python-multiprocessing

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

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

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

2 个答案:

答案 0 :(得分:9)

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

我建议你有两个选择:

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

  2. 自己挑选数据;即:a_queue.put(pickle.dumps(data))pickle.loads(a_queue.get())。现在,如果您在data.clear()后执行put,则数据已经由您“序列化”。

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

答案 1 :(得分:2)

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

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

基本上,在字典被清除之前你不能指望发送完成,所以你不应该尝试。当dc超出范围或再次执行代码时,它将被垃圾收集。