Pythonでは、threadingn.Event協調スレッドを使用した運転詳細を説明します。


threadingn.Eventメカニズムは、他のスレッドに対して一つのスレッドが発行するモードと似ています。他のスレッドはいずれもthreadingn.Eventのオブジェクトを持っています。これらのスレッドはこのイベントの「発生」を待っています。このイベントが発生しない限り、これらのスレッドはイベントの「発生」までブロックされます。
これに対して、例えばマルチスレッドがRedisキューからデータを読み出して処理するアプリケーションシーンを考慮しても良いです。これらのスレッドはRedisを接続するサービスを試みています。一般的にRedis接続がうまくいかないと、各スレッドのコードの中で再接続を試みます。
もし我々が起動時にRedisサービスが正常であることを確認したいならば、それらの作業スレッドをRedisサーバに接続させることができます。
メインスレッドではRedisサービスへの接続を試みていますが、正常であればイベントをトリガし、各作業スレッドはRedisサービスへの接続を試みています。
そのためには、次のような手順を書くことができます。

import threading
import time
import logging
 
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s',)
 
def worker(event):
  logging.debug('Waiting for redis ready...')
  event.wait()
  logging.debug('redis ready, and connect to redis server and do some work [%s]', time.ctime())
  time.sleep(1)
 
readis_ready = threading.Event()
t1 = threading.Thread(target=worker, args=(readis_ready,), name='t1')
t1.start()
 
t2 = threading.Thread(target=worker, args=(readis_ready,), name='t2')
t2.start()
 
logging.debug('first of all, check redis server, make sure it is OK, and then trigger the redis ready event')
time.sleep(3) # simulate the check progress 
readis_ready.set()
このプログラムを実行:

(t1    ) Waiting for redis ready...
(t2    ) Waiting for redis ready...
(MainThread) first of all, check redis server, make sure it is OK, and then trigger the redis ready event
(t2    ) redis ready, and connect to redis server and do some work [Wed Nov 5 12:45:03 2014]
(t1    ) redis ready, and connect to redis server and do some work [Wed Nov 5 12:45:03 2014]
t 1とt 2スレッドの開始時は、Redisサーバの起動待ち場所に閉塞しています。一旦、メインスレッドがRedisサーバが正常に起動していると判定されると、Redis_uをトリガします。readyイベントは、各作業スレッドがredisに接続して作業を行う。
threading.Eventのwaitメソッドはタイムアウトパラメータも受け付けていますが、デフォルトではイベントが発生していない場合、waitメソッドはずっとブロックされています。このタイムアウトパラメータを加えると、ブロック時間がこのパラメータ設定の値を超えたら、waitメソッドは戻ります。
上記のアプリケーションシーンに対応して、Redisサーバが一致して起動していない場合、私たちはサブスレッドがログを印刷して、現在接続できるRedisサービスがないことを絶えず注意してほしいです。このタイムアウトパラメータを設定することによって、このような目的を達成できます。

import threading
import time
import logging
 
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s',)
 
def worker(event):
  while not event.is_set():
    logging.debug('Waiting for redis ready...')
    event.wait(1)
  logging.debug('redis ready, and connect to redis server and do some work [%s]', time.ctime())
  time.sleep(1)
 
readis_ready = threading.Event()
t1 = threading.Thread(target=worker, args=(readis_ready,), name='t1')
t1.start()
 
t2 = threading.Thread(target=worker, args=(readis_ready,), name='t2')
t2.start()
 
logging.debug('first of all, check redis server, make sure it is OK, and then trigger the redis ready event')
time.sleep(3) # simulate the check progress 
readis_ready.set()
前の無限ブロックバージョンと唯一の違いは、作業スレッドにwhileループを追加して、redis_まで行っています。readyイベントがトリガされてからサイクルが終了します。waitメソッドの呼び出しは1秒のタイムアウト後に戻ります。そうすると、各作業スレッドがシステム起動時にredis gauを待つことができます。readyは同時に状態情報を記録します。
このプログラムの実行結果は以下の通りです。

(t1    ) Waiting for redis ready...
(t2    ) Waiting for redis ready...
(MainThread) first of all, check redis server, make sure it is OK, and then trigger the redis ready event
(t2    ) Waiting for redis ready...
(t1    ) Waiting for redis ready...
(t2    ) Waiting for redis ready...
(t1    ) Waiting for redis ready...
(t2    ) redis ready, and connect to redis server and do some work [Wed Nov 5 13:55:46 2014]
(t1    ) redis ready, and connect to redis server and do some work [Wed Nov 5 13:55:46 2014]
このように、私たちはRedisサービスの起動を待ちながら、作業スレッドの中で待っている状況を見ることができます。
以上のPythonでは、threadingn.Event協調スレッドを使って実行しています。詳細は小編集が皆さんに共有している内容です。参考にしていただければと思います。どうぞよろしくお願いします。