Pythonスレッド条件変数のCodition原理解析
この文章は主にPythonスレッド条件変数Condationの原理解析を紹介しています。ここでは例示コードによって紹介された非常に詳細で、皆さんの学習や仕事に対して一定の参考学習価値があります。必要な友達は下記を参照してください。
Condationオブジェクトは条件変数であり、常に何らかのロックに関連しています。外部から入ってきたロックまたはシステムがデフォルトで作成したロックです。いくつかの条件変数がロックを共有する時、あなたは自分でロックを入れるべきです。このロックはあなたが心配する必要はありません。コンディショナークラスはそれを管理します。
acquire()とrelease()は、これに関連するロックを操作することができます。他の方法はこの錠がロックされている場合に使用しなければなりません。wait()はこのロックを解除します。他のスレッドがnotify()またはnotify_を通過するまでこのスレッドをブロックします。allはそれを呼び覚ます。一旦起こされたら、この錠はまたwaitにロックされます。
古典的なconsumer/producer問題のコード例は次の通りである。
Condationオブジェクトは条件変数であり、常に何らかのロックに関連しています。外部から入ってきたロックまたはシステムがデフォルトで作成したロックです。いくつかの条件変数がロックを共有する時、あなたは自分でロックを入れるべきです。このロックはあなたが心配する必要はありません。コンディショナークラスはそれを管理します。
acquire()とrelease()は、これに関連するロックを操作することができます。他の方法はこの錠がロックされている場合に使用しなければなりません。wait()はこのロックを解除します。他のスレッドがnotify()またはnotify_を通過するまでこのスレッドをブロックします。allはそれを呼び覚ます。一旦起こされたら、この錠はまたwaitにロックされます。
古典的なconsumer/producer問題のコード例は次の通りである。
import threading
import time
import logging
logging.basicConfig(level=logging.DEBUG,
format='(%(threadName)-9s) %(message)s',)
def consumer(cv):
logging.debug('Consumer thread started ...')
with cv:
logging.debug('Consumer waiting ...')
cv.acquire()
cv.wait()
logging.debug('Consumer consumed the resource')
cv.release()
def producer(cv):
logging.debug('Producer thread started ...')
with cv:
cv.acquire()
logging.debug('Making resource available')
logging.debug('Notifying to all consumers')
cv.notify()
cv.release()
if __name__ == '__main__':
condition = threading.Condition()
cs1 = threading.Thread(name='consumer1', target=consumer, args=(condition,))
#cs2 = threading.Thread(name='consumer2', target=consumer, args=(condition,state))
pd = threading.Thread(name='producer', target=producer, args=(condition,))
cs1.start()
time.sleep(2)
#cs2.start()
#time.sleep(2)
pd.start()
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。