在CPython中检查None threadsafe吗?

时间:2017-08-24 15:11:20

标签: python multithreading thread-safety

我在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的线程。

我有几个检查"不是没有"或"是无"。这些会造成问题吗?例如。可以发生邪恶事件或者这些检查是否安全?

1 个答案:

答案 0 :(得分:1)

你问题的标题是:

  

是否在CPython中检查None线程安全?

多线程程序中可能出现很多问题,但is [not] None检查不是其中之一。

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

然而,你似乎真正要求的是

  

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

为此,我说"为什么要重新发明Queue.Queue(1)?"

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