Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python线程-how do";条件.等待“;及;条件.通知所有人“;工作_Python_Multithreading_Conditional Statements_Wait - Fatal编程技术网

python线程-how do";条件.等待“;及;条件.通知所有人“;工作

python线程-how do";条件.等待“;及;条件.通知所有人“;工作,python,multithreading,conditional-statements,wait,Python,Multithreading,Conditional Statements,Wait,我有以下“消费者”代码: 以及以下生产商代码: .... while 1 : cond.acquire() #acquire the lock print currentThread(), "lock acquired" print currentThread(),"Produced One Item" itemq.produce() cond.notifyAll()

我有以下“消费者”代码:

以及以下生产商代码:

....     
while 1 :


           cond.acquire() #acquire the lock
           print currentThread(), "lock acquired"
           print currentThread(),"Produced One Item"
           itemq.produce()
           cond.notifyAll()
           cond.release()

           time.sleep(self.sleeptime)
我正在运行一个制作人和两个消费者的程序。 我不知道会有什么结果。生产者调用“notifyAll()”,因此我希望两个消费者都从“等待”中醒来。我看到两个消费者确实都获得了锁,但只有第一个获得锁的消费者才能真正获得物品。谁能告诉我“等待”命令是如何工作的?如果两个线程都获得了“notifyAll”,那么如何只有一个线程能够使用它呢

谢谢, 李

我想很清楚:

wait()方法释放锁, 然后阻塞直到它被唤醒 通过对的notify()或notifyAll()调用 另一个中的相同条件变量 线一旦觉醒,它就会重新获得 锁打开并返回。也是 可以指定超时

注意:notify()和notifyAll() 方法不释放锁;这 表示一个或多个线程 觉醒者不会从他们的生活中回来 wait()立即调用,但仅当 调用notify()或 notifyAll()最终放弃 锁的所有权。锁的所有权

当然,在任何时候只有一个线程可以拥有锁:毕竟,这是核心拥有锁的首要目的


因此,
notifyAll
将所有等待的线程置于就绪运行状态,本质上所有线程都在等待再次获取锁,以便它们可以继续:一旦通知程序释放锁,等待获取锁的线程中有一个会获取锁(当然,其他线程(如果有的话)会一直等待锁再次释放,以便在任何给定时间只有一个线程拥有锁)。

钥匙在等待的循环中:

while itemq.isEmpty():
        cond.wait()
cond.wait()是这样实现的(仅示例):

因此,由于锁,一次只有一个使用者退出“wait”函数。退出wait函数的第一个使用者检测到itemq.isEmpty()==false并继续消费该项。然后,他们重新进入wait函数并释放锁


第二个消费者退出,检测到itemq.isEmpty()==再次为true,然后立即重新进入wait()。

提示:你应该接受更多答案,以提高获得答案的几率。我甚至不知道有这样的可能性:)感谢上帝,它是可逆的。我想我将永远被谴责:)我从来都不明白这在Python中是如何工作的。如果在释放()之前通知(),则锁仍被占用,则唤醒线程,并且只有在释放条件的线程保持控件调用释放的情况下,任何在释放之前获取控件的唤醒线程都将在notify()之后立即进入睡眠状态。看起来Python中的原子性概念是相对的。谢谢:)我注意到第一个获得锁的人是赢家。它是以队列或其他方式实现的吗?@user,实现细节(没有文档记录,可能会因任何原因或无任何原因随时更改)。如果您对某个特定版本感兴趣,请查看Python源代码,例如:这里:第150行和下面的代码(包括用于获取/还原和发布/保存的内部例程)。谢谢:)我想我不明白,如果某个线程没有赢得锁,它将等待另一个notify()…我想一旦他被唤醒,他只会等待锁,不会等待另一个notify()…@AlexMartelli你是想链接到XMPP rfc吗?我发现一本更有趣的书;)
while itemq.isEmpty():
        cond.wait()
def wait():
    cond.release()
    wait for notify
    cond.aquire()