qshinoの日記

Powershell関係と徒然なこと

python 非同期スレッド、プロセス

スレッド関係

import threading

  1. start()
  2. threading.Thread( xx,args=(,), kwargs={})
  3. setDaemon(True)
  4. lock= threading.Lock() lock.acquire(), lock.release()
  5. lock = threading.Rlock() with lock:
  6. Semaphore(n) with:
  7. queue.Queue() put(x) get() qsize()
  8. event()
  9. enumerate()
  10. threading.Timer(time,func)
  11. import concurrent.futures executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) executor.submit(func1) executor.submit(func2)
  12. 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

https://qiita.com/tag1216/items/2dcb112f8018eb19a999