ホームページ >バックエンド開発 >Python チュートリアル >Python スレッドで条件変数を使用する方法

Python スレッドで条件変数を使用する方法

不言
不言オリジナル
2018-09-11 16:03:592228ブラウズ

この記事は、Python スレッドでの条件変数の使用法に関する内容を提供します。一定の参考値があります。必要な友人は参照してください。お役に立てば幸いです。

条件変数は、別のロック上に構築された同期プリミティブです。このロックは、スレッドが特定の状態変化またはイベントに注意を払う必要がある場合に使用されます。典型的な使用法は、あるスレッドによって生成されたデータが別のスレッドに提供される、プロデューサーとコンシューマーの問題です。

構文:

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()
        #使用生产的东西
        ...

注: 同じ条件を待機しているスレッドが複数ある場合、notify() 操作は、それらの 1 つ以上を起動します (この動作は基礎となるオペレーティング システムによって異なります)。したがって、スレッドがウェイクアップした後、待機していた条件がもう存在しないことが判明する可能性が常にあります。これが、コンシューマー関数で while ループが使用される理由の説明になります。スレッドはウェイクアップしたが、生成されたアイテムが消えた場合は元に戻り、次の信号を待ちます。

関連する推奨事項:

条件変数とスレッドに関する 10 の推奨記事

Python マルチスレッド変数の簡単な分析問題###############

以上がPython スレッドで条件変数を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。