Python-multithreading
Python-マルチスレッドプログラミング
複数のスレッドを実行すると、複数の異なるプログラムを同時に実行することに似ていますが、次の利点があります-
- プロセス内の複数のスレッドはメインスレッドと同じデータ空間を共有するため、別々のプロセスである場合よりも簡単に情報を共有したり、相互に通信したりできます。
- スレッドはライトウェイトプロセスと呼ばれることもあり、多くのメモリオーバーヘッドを必要としません。プロセスよりも安価です。
スレッドには、開始、実行シーケンス、および結論があります。 コンテキスト内で現在実行されている場所を追跡する命令ポインターがあります。
- 先取り(中断)することができます
- 他のスレッドが実行されている間、一時的に保留(スリープとも呼ばれます)できます-これは、譲歩と呼ばれます。
新しいスレッドの開始
別のスレッドを生成するには、_thread_モジュールで利用可能な次のメソッドを呼び出す必要があります-
このメソッド呼び出しにより、LinuxとWindowsの両方で新しいスレッドを高速かつ効率的に作成できます。
メソッド呼び出しはすぐに戻り、子スレッドが開始され、_args_の渡されたリストで関数を呼び出します。 関数が戻ると、スレッドは終了します。
ここで、_args_は引数のタプルです。引数を渡さずに関数を呼び出すには、空のタプルを使用します。 _kwargs_は、キーワード引数のオプションの辞書です。
例
上記のコードが実行されると、次の結果が生成されます-
低レベルのスレッド化には非常に効果的ですが、_thread_モジュールは新しいスレッド化モジュールに比べて非常に制限されています。
_Threading_モジュール
Python 2.4に含まれている新しいスレッドモジュールは、前のセクションで説明したスレッドモジュールよりも強力で高レベルなスレッドのサポートを提供します。
_threading_モジュールは_thread_モジュールのすべてのメソッドを公開し、いくつかの追加のメソッドを提供します-
- * threading.activeCount()*-アクティブなスレッドオブジェクトの数を返します。
- * threading.currentThread()*-呼び出し元のスレッドコントロール内のスレッドオブジェクトの数を返します。
- * threading.enumerate()*-現在アクティブなすべてのスレッドオブジェクトのリストを返します。
メソッドに加えて、スレッド化モジュールには、スレッド化を実装する_Thread_クラスがあります。 _Thread_クラスによって提供されるメソッドは次のとおりです-
- * run()*-run()メソッドは、スレッドのエントリポイントです。
- * start()*-start()メソッドは、runメソッドを呼び出してスレッドを開始します。
- * join([time])*-join()はスレッドが終了するのを待ちます。
- * isAlive()*-isAlive()メソッドは、スレッドがまだ実行中かどうかを確認します。
- * getName()*-getName()メソッドは、スレッドの名前を返します。
- * setName()*-setName()メソッドは、スレッドの名前を設定します。
_Threading_モジュールを使用したスレッドの作成
スレッドモジュールを使用して新しいスレッドを実装するには、次を行う必要があります-
- _Thread_クラスの新しいサブクラスを定義します。
- _ init(self [、args])_メソッドをオーバーライドして、引数を追加します。
- 次に、run(self [、args])メソッドをオーバーライドして、開始時にスレッドが行うべきことを実装します。
新しい_Thread_サブクラスを作成したら、そのインスタンスを作成し、_start()_を呼び出して新しいスレッドを開始し、_run()_メソッドを呼び出します。
例
上記のコードが実行されると、次の結果が生成されます-
スレッドの同期
Pythonで提供されるスレッドモジュールには、スレッドを同期するための実装が簡単なロックメカニズムが含まれています。 新しいロックを返すには、_Lock()_メソッドを呼び出して新しいロックを作成します。
新しいロックオブジェクトの_acquire(blocking)_メソッドは、スレッドを強制的に同期的に実行するために使用されます。 オプションの_blocking_パラメーターを使用すると、スレッドがロックの取得を待機するかどうかを制御できます。
_blocking_が0に設定されている場合、スレッドは、ロックを取得できない場合はすぐに0の値を返し、ロックが取得された場合は1を返します。 ブロックが1に設定されている場合、スレッドはブロックし、ロックが解除されるのを待ちます。
新しいロックオブジェクトの_release()_メソッドは、不要になったときにロックを解除するために使用されます。
例
上記のコードが実行されると、次の結果が生成されます-
マルチスレッドプライオリティキュー
_Queue_モジュールを使用すると、特定の数のアイテムを保持できる新しいキューオブジェクトを作成できます。 キューを制御するには、次の方法があります-
- * get()*-get()は、キューからアイテムを削除して返します。
- * put()*-putは、アイテムをキューに追加します。
- * qsize()*-qsize()は、現在キューにあるアイテムの数を返します。
- * empty()*-empty()は、キューが空の場合にTrueを返します。それ以外の場合、False。
- * full()*-キューがいっぱいの場合、full()はTrueを返します。それ以外の場合、False。
例
上記のコードが実行されると、次の結果が生成されます-