【问题标题】:Python multiprocessing Queue put() behaviorPython 多处理队列 put() 行为
【发布时间】:2015-04-20 00:20:33
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 这是我现在正在做的一种解决方法,但我不想要额外的副本只是为了确保序列化实际上会在正确的时刻发生。
    【解决方案2】:

    实际上,这被认为是一个功能,而不是一个问题。 队列立即返回,因此您的进程在序列化发生时继续进行,并避免所谓的“queue contention”。

    我建议你有两个选择:

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

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

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

    【讨论】:

    • 感谢您的回答,选项 1 绝对是最优雅的,因为复制数据的时间远远大于创建新字典并让 GC 处理的时间。
    • 这实际上是一个“它不是错误,而是一个功能!” python中的时刻
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 2010-10-29
    • 2018-06-30
    • 2012-07-11
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多