【问题标题】:Are checks for None threadsafe in CPython?在 Python 中检查非线程安全吗?
【发布时间】:2017-08-24 15:11:19
【问题描述】:

我在 Python 中有一个生产者 - 消费者问题的变体(我希望有多个生产者可以只生产一个项目并立即阻塞等待它被消费,并且消费者不会阻塞并定期轮询如果有东西要消耗...),我想知道以下代码是否安全地实现了这一点。

我对在 Python 中检查 None 是否是线程安全的特别感兴趣:

class Worker(object):
    def __init__(...):
        self.item = None
        self.item_lock = threading.Lock()
        self.item_consumed = threading.Condition()

    def produce_something(...):
        with self.item_lock:
            self.item = make_a_complicated_data_structure()
            with self.item_consumed:
               while self.item is not None:
                   self.item_consumed.wait()

    def consume_it():
        if self.item is None:
            return
        with self.item_consumed:
            do_something_with(self.item)
            self.item = None
            self.item_consumed.notify()

假设有一堆线程在运行produce_something,而一个线程定期轮询consume_it

我有几个检查“不是无”或“没有”。这些会造成问题吗?例如。会发生一些邪恶的事情还是这些检查线程安全?

【问题讨论】:

    标签: python multithreading thread-safety


    【解决方案1】:

    你的问题的标题是:

    在 CPython 中检查 None 线程安全吗?

    在多线程程序中很多事情都可能出错,但is [not] None 检查不是其中之一。

    在 CPython 中,None 是一个单例,因此检查相当于获取对象的地址并将其与进程生命周期内固定的常量进行比较。

    但是,您似乎真正要问的是

    我的代码是线程安全的吗?

    对此我说“为什么要重新发明Queue.Queue(1)?”

    它可以简单而可靠地完成您想要的一切。您无需推出自己的实现,然后想知道它是否是线程安全的。

    【讨论】:

    • 将 Queue.Queue(1) 与我上面的实现进行比较,我注意到 Queue.Queue 不仅可以完成我需要做的所有事情,而且速度也快了大约 100 倍(!)。所以我们有一个明显的赢家:-)
    猜你喜欢
    • 2013-08-29
    • 2018-11-16
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多