python 非同期スレッド、プロセス
スレッド関係
import threading
- start()
- threading.Thread( xx,args=(,), kwargs={})
- setDaemon(True)
- lock= threading.Lock() lock.acquire(), lock.release()
- lock = threading.Rlock() with lock:
- Semaphore(n) with:
- queue.Queue() put(x) get() qsize()
- event()
- enumerate()
- threading.Timer(time,func)
- import concurrent.futures executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) executor.submit(func1) executor.submit(func2)
- import time time.sleep(3)
lock rlock 違い
どちらもwith 構文対応。
Lockオブジェクト acquire([1]) ●ロックされていなかった場合、ロックを取得し、ロックが解放されるまで、どのスレッドからもブロックし続けます。 ●ロックされていた場合 ●引数に1(True)を指定した場合 : ロックされていた場合、ロックが解放されるまで待機します。 ●引数に0(False)を指定した場合 : ロックされていた場合、Falseを返します。 release() ●ロックを解放します。どのスレッドからでも解放することができます。 RLockオブジェクト acquire([1]) ●ロックされていなかった場合、ロックを取得し、ロックが解放されるまで、他スレッドからのみブロックし続けます。 ●ロックされていて、自スレッドがロックを取得していた場合 ●引数に1(True)を指定した場合 : 再帰レベルが+1され、即Trueを返します。 ●引数に0(False)を指定した場合 : 引数1と同じ。 ●ロックされていて、他スレッドがロックを取得していた場合 ●引数に1(True)を指定した場合 : ロックが解放されるまで待機します。 ●引数に0(False)を指定した場合 : 即Falseを返します。 release() ●ロックを解放します。ロックを取得しているスレッドからのみ、解放することができます。 ●acquire()を呼び出した数(再帰レベル)だけ、release()を呼ぶ必要があります。
logging
import logging
logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s')
logging.debug('end')
使い方
スレッド間のデータ通信
一方向ならqueue()が簡単。ランダムなら、辞書を引数で渡してlock()制御。 ビックロックになりそうなら、リソース毎ロック、ロック配列か辞書等を作成する。マルチロックによるデッドロックにならないように。
参考
Thread, pool
https://qiita.com/castaneai/items/9cc33817419896667f34
queue lock semaphore
https://qiita.com/init/items/74b36eba31ccbc0364ed
lock rlock
http://pyshu.blog111.fc2.com/blog-entry-79.html
event