我在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
的线程。
我有几个检查"不是没有"或"是无"。这些会造成问题吗?例如。可以发生邪恶事件或者这些检查是否安全?
答案 0 :(得分:1)
你问题的标题是:
是否在CPython中检查
None
线程安全?
多线程程序中可能出现很多问题,但is [not] None
检查不是其中之一。
在CPython中,None
是一个单例,因此检查等同于获取对象的地址并将其与在过程生命周期中固定的常量进行比较。
然而,你似乎真正要求的是
我的代码是否是线程安全的?
为此,我说"为什么要重新发明Queue.Queue(1)
?"
它可以简单可靠地完成您想要的一切。您不需要推出自己的实现,然后想知道它是否是线程安全的。