是队列.full()使用单线程时是否可靠?

2024-06-23 19:42:24 发布

您现在位置:Python中文网/ 问答频道 /正文

Python的thread-safe ^{}对象有一个名为^{}的有用函数,其中包含以下文档:

Return True if the queue is full, False otherwise. If full() returns True it doesn’t guarantee that a subsequent call to get() will not block. Similarly, if full() returns False it doesn’t guarantee that a subsequent call to put() will not block.

很明显,在多线程场景中,队列中有多个线程put()项和多个线程get()项,存在竞争条件。但是,如果只有一个线程使用put(),而一个不同的线程使用get(),那么{}的值就不能被信任了吗?
这是一个特定于Python实现的问题吗?如果是这样,CPython的答案是什么?在


Tags: tofalsetruegetifthatputit
2条回答

如果你的意思是你只使用一个线程来做所有事情,那么是的。如果没有其他人访问它,它就没有办法改变。在

如果你的意思是总体上有两个线程,那么不,仍然存在竞争条件的机会。在

不管怎样,真正的问题是你为什么要这样做?试试看,如果它失败了,就捕捉异常——这是Python的方法。在

try:
    some_queue.get_nowait()
except queue.Empty:
    do_something_else()

这样做的好处是将来是线程安全的,并且在任何情况下都避免了争用情况(不需要线程来导致这种情况,您只需在check和get之间进行一个调用来更改代码)。在

编辑:正如larsmans在下面的评论中指出的,在与竞态条件有关的其他问题中,CPython的Queue.full()标记为可能在某个时刻被移除,因此还有另一个避免它的原因。在

我曾经观察到Queue()中的isfull信息更新延迟,因为它本身使用了一个特殊的线程(!)去做一些事情,比如放和得到。所以即使我(!)我只使用一个线程。也许排队不是

相关问题 更多 >

    热门问题