Der Inhalt dieses Artikels befasst sich mit der Verwendung von Bedingungsvariablen in Python-Threads. Ich hoffe, dass er für Freunde hilfreich ist.
Eine Bedingungsvariable ist ein Synchronisationsprimitiv, das auf einer anderen Sperre basiert. Diese Sperre wird verwendet, wenn der Thread auf eine bestimmte Statusänderung oder ein bestimmtes Ereignis achten muss. Die typische Verwendung ist das Produzenten- und Konsumentenproblem, bei dem die von einem Thread erzeugten Daten einem anderen Thread bereitgestellt werden.
c=Condition(lock) 穿件新的条件变量。lock时可选的Lock或RLock的实例。如果未提供lock参数,就会创建新的RLock实例供条件变量使用。
c.acquire(*args):获取底层锁。此方法将调用底层锁上对应的acquire(*args)方法。 c.release():释放底层锁。此方法将调用底层锁上对应的release()方法 c.wait(timeout):等待直到获取通知或出现超时为止。此方法在调用线程已经获取锁之后调用。 调用时,将释放底层锁,而且线程将进入睡眠状态,直到另一个线程在条件变量上执行notify()或notify_all()方法将其唤醒为止。 在线程被唤醒后,线程讲重新获取锁,方法也会返回。timeout是浮点数,单位为秒。 如果超时,线程将被唤醒,重新获取锁,而控制将被返回。 c.notify(n):唤醒一个或多个等待此条件变量的线程。此方法只会在调用线程已经获取锁之后调用, 而且如果没有正在等待的线程,它就什么也不做。 n指定要唤醒的线程数量,默认为1.被唤醒的线程在它们重新获取锁之前不会从wait()调用返回。 c.notify_all():唤醒所有等待此条件的线程。
#条件变量实例 from threading import Condition c=Condition() def producer(): while True: c.acquire() #生产东西 ... c.notify() c.release() def consumer(): while True: c.acquire() while 没有可用的东西: c.wait()#等待出现 c.release() #使用生产的东西 ...
Hinweis: Wenn mehrere Threads auf dieselbe Bedingung warten , Die Operation notify() weckt einen oder mehrere von ihnen (dieses Verhalten hängt vom zugrunde liegenden Betriebssystem ab). Daher besteht immer die Möglichkeit, dass ein Thread nach dem Aufwachen feststellt, dass die Bedingung, auf die er gewartet hat, nicht mehr vorhanden ist. Dies erklärt, warum in der Verbraucherfunktion eine While-Schleife verwendet wird, wenn der Thread aufwacht, das generierte Element jedoch vorhanden ist verschwunden ist, geht es zurück und wartet auf das nächste Signal.
Verwandte Empfehlungen:
10 empfohlene Artikel über Bedingungsvariablen und Threads
Eine kurze Analyse der Python-Multithreading-Variable Problem
Das obige ist der detaillierte Inhalt vonSo verwenden Sie Bedingungsvariablen in Python-Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!