gpt4 book ai didi

python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?

转载 作者:太空狗 更新时间:2023-10-29 22:24:08 24 4
gpt4 key购买 nike

我最近编写了一个使用简单的生产者/消费者模式的程序。它最初有一个与不正确使用 threading.Lock 有关的错误,我最终修复了它。但这让我想到是否可以以无锁的方式实现生产者/消费者模式。

我的要求很简单:

  • 一个生产者线程。
  • 一个消费者线程。
  • 队列中只有一项。
  • 生产者可以在当前项目被消费之前生产下一个项目。因此,当前项目丢失了,但这对我来说没关系。
  • 消费者可以在生产下一个项目之前消耗当前项目。因此,当前项目被消耗了两次(或更多),但这对我来说没问题。

所以我这样写:

QUEUE_ITEM = None

# this is executed in one threading.Thread object
def producer():
global QUEUE_ITEM
while True:
i = produce_item()
QUEUE_ITEM = i

# this is executed in another threading.Thread object
def consumer():
global QUEUE_ITEM
while True:
i = QUEUE_ITEM
consume_item(i)

我的问题是:这段代码是线程安全的吗?

立即评论:这段代码并不是真正无锁的——我使用 CPython,它有 GIL。

我对代码进行了一些测试,它似乎可以工作。它转化为一些 LOAD 和 STORE 操作,由于 GIL,它们是原子的。但我也知道当 x 实现 __del__ 方法时 del x 操作不是原子的。因此,如果我的项目有一个 __del__ 方法并且发生了一些讨厌的调度,事情可能会崩溃。还是不行?

另一个问题是:我必须施加什么样的限制(例如对生产项目的类型)才能使上述代码正常工作?

我的问题只是关于利用 CPython 和 GIL 的怪癖来提出无锁(即没有锁,如 threading.Lock 明确地在代码中)解决方案的理论可能性。

最佳答案

诡计会咬你。只需使用队列在线程之间进行通信即可。

关于python - 这种 Python 生产者-消费者无锁方法是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/854906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com