Pythonの低レベルスレッドAPI:_threadモジュールの基本と使い方
Python標準ライブラリの _thread モジュールは、グローバルなデータ空間を共有する複数のスレッドからなる軽量プロセスを扱うための低レベルインターフェースを提供します。スレッド間の同期には、シンプルなロック(ミューテックスやバイナリセマフォとも呼ばれます)が用意されています。また、組み込みモジュールである threading は、このモジュールを土台として構築された、より高レベルなスレッドAPIを提供しています。
start_new_thread()
このモジュールレベルの関数は、現在のプロセス内で新しいスレッドを起動するために使用します。引数として関数オブジェクトを受け取り、新しいスレッドの作成に成功すると、その関数が呼び出されます。この関数の実行期間がそのままスレッドの寿命に対応します。また、sleep() 関数を呼び出すことで、スレッドを一時的にブロック(停止)させることも可能です。
以下は、_thread モジュールを使ったシンプルなスレッド処理の例です。
import _thread
import time
def run( threadName):
count = 0
for i in range(1,6):
time.sleep(5)
print ( threadName, i )
_thread.start_new_thread( run, ("child", ) )
for i in range(1,6):
print ( 'main', i )
time.sleep(5)
start_new_thread() 関数は新しいスレッドを生成し、run 関数を並行して呼び出します。run() 関数内にもプログラムのメインスレッドにもループがあり、それぞれで sleep() を呼び出しているため、以下のように両者の実行が交互に行われます。
main 1 child 1 main 2 child 2 main 3 child 3 main 4 child 4 main 5 child 5
ロックによるスレッド間の同期
スレッド間の同期は、Lock オブジェクトを使用することで実現できます。allocate_lock() 関数がロックオブジェクトを返します。このロックオブジェクトには、以下のメソッドが用意されています。
acquire()
このメソッドは、別のスレッドによって解放されるまで無条件にロックを取得します。同時にロックを取得できるのは1つのスレッドだけです。戻り値は、ロックの取得に成功した場合は True、失敗した場合は False になります。
release()
このメソッドはロックを解放します。ロックは事前に取得されている必要がありますが、必ずしも同じスレッドが取得したものである必要はありません。
次の例では、2つのスレッドを宣言し、それぞれが run() 関数を同時に実行します。一方のスレッドがロックを取得して synchronized 関数に入り、もう一方のスレッドは待機状態になります。
import _thread
import time
def run( threadName):
lock.acquire()
synchronized(threadName)
lock.release()
def synchronized(threadName):
print (threadName,"has acquired lock")
counter = 10
while counter:
time.sleep(1)
print ('*', end='')
counter = counter-1
print('\n{} has released lock'.format( threadName))
lock = _thread.allocate_lock()
_thread.start_new_thread( run, ("t1", ) )
_thread.start_new_thread( run, ("t2", ) )
実行結果
>>> t1 has acquired lock ********** t1 has released lock t2 has acquired lock ********** t2 has released lock
-
Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説
本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値
-
Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法
この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print