Maison  >  Article  >  développement back-end  >  Comment utiliser les variables de condition dans les threads Python

Comment utiliser les variables de condition dans les threads Python

不言
不言original
2018-09-11 16:03:592195parcourir

Le contenu de cet article concerne l'utilisation des variables de condition dans les threads Python. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Une variable de condition est une primitive de synchronisation construite sur un autre verrou. Ce verrou sera utilisé lorsque le thread doit prêter attention à un changement d'état ou à un événement spécifique. L'utilisation typique est le problème du producteur et du consommateur, dans lequel les données produites par un thread sont fournies à un autre thread.

Syntaxe :

c=Condition(lock)
穿件新的条件变量。lock时可选的Lock或RLock的实例。如果未提供lock参数,就会创建新的RLock实例供条件变量使用。

Méthodes courantes :

c.acquire(*args):获取底层锁。此方法将调用底层锁上对应的acquire(*args)方法。

c.release():释放底层锁。此方法将调用底层锁上对应的release()方法

c.wait(timeout):等待直到获取通知或出现超时为止。此方法在调用线程已经获取锁之后调用。
调用时,将释放底层锁,而且线程将进入睡眠状态,直到另一个线程在条件变量上执行notify()或notify_all()方法将其唤醒为止。
在线程被唤醒后,线程讲重新获取锁,方法也会返回。timeout是浮点数,单位为秒。
如果超时,线程将被唤醒,重新获取锁,而控制将被返回。

c.notify(n):唤醒一个或多个等待此条件变量的线程。此方法只会在调用线程已经获取锁之后调用,
而且如果没有正在等待的线程,它就什么也不做。
n指定要唤醒的线程数量,默认为1.被唤醒的线程在它们重新获取锁之前不会从wait()调用返回。

c.notify_all():唤醒所有等待此条件的线程。

Modèle d'instance : utiliser des variables de condition

#条件变量实例
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()
        #使用生产的东西
        ...

Remarque : s'il y en a plusieurs Les threads attendent la même condition, et l'opération notify() en réveillera un ou plusieurs (ce comportement dépend du système d'exploitation sous-jacent). Par conséquent, il est toujours possible qu'après le réveil d'un thread, il découvre que la condition qu'il attendait n'existe plus. Cela explique pourquoi une boucle while est utilisée dans la fonction consommateur si le thread se réveille mais que l'élément généré l'est. disparu, il reviendra en arrière et attendra le prochain signal.

Recommandations associées :

10 articles recommandés sur les variables de condition et les threads

Une brève analyse de la variable multithread Python problème

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn