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的答案是什么?在
如果你的意思是你只使用一个线程来做所有事情,那么是的。如果没有其他人访问它,它就没有办法改变。在
如果你的意思是总体上有两个线程,那么不,仍然存在竞争条件的机会。在
不管怎样,真正的问题是你为什么要这样做?试试看,如果它失败了,就捕捉异常——这是Python的方法。在
这样做的好处是将来是线程安全的,并且在任何情况下都避免了争用情况(不需要线程来导致这种情况,您只需在check和get之间进行一个调用来更改代码)。在
编辑:正如larsmans在下面的评论中指出的,在与竞态条件有关的其他问题中,CPython的
Queue.full()
标记为可能在某个时刻被移除,因此还有另一个避免它的原因。在我曾经观察到Queue()中的isfull信息更新延迟,因为它本身使用了一个特殊的线程(!)去做一些事情,比如放和得到。所以即使我(!)我只使用一个线程。也许排队不是
相关问题 更多 >
编程相关推荐