Python低レベルスレッドAPI
Pythonライブラリの「_thread」モジュールは、グローバルデータスペースを共有する複数のスレッドを持つ軽量プロセスを操作するための低レベルのインターフェイスを提供します。同期のために、このモジュールでは単純なロック(ミューテックスまたはバイナリセマフォとも呼ばれます)が定義されています。 「スレッド化」組み込みモジュールは、このモジュールの上に構築された高レベルのスレッド化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オブジェクトを使用して実現されます。 locate_lock()関数はロックオブジェクトを返します。以下の方法が利用できます
acquire()
このメソッドは、別のスレッドによって解放されるまで、無条件にロックを取得します。一度に1つのスレッドのみがロックを取得できます。戻り値は、ロックが正常に取得された場合はTrue、そうでない場合はFalseです。
release()
このメソッドはロックを解放します。ロックは以前に取得されている必要がありますが、必ずしも同じスレッドによって取得されている必要はありません。
次の例では、2つのスレッドが宣言されています。それぞれがrun()関数を同時に呼び出します。それらの1つはロックを取得し、他の待機中に「同期」機能に入ります。
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を返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/
-
Intersection()関数Python
この記事では、任意のセットで実行できるintersection()関数について学習します。数学によると、共通部分とは、2つのセットから共通の要素を見つけることを意味します。 構文 <set name>.intersection(<set a1> <set a2> ……..) 戻り値 引数として渡されるセット内の共通要素。 例 set_1 = {'t','u','t','o','r','i','a','l&