マルチスレッド化とマルチプロセッシングは、同時実行と並列化を実現する最も寻常的な 2 つの的办法ですが、これらの違いを体谅している開発者は多くなく、どちらをいつ利用するかを効果的に選択できません。
この記事では、マルチスレッドとマルチプロセッシングの違いと、何を利用するかを決定する形式と、Python でそれを実装する形式について説明します。
スレッドとは スレッドは独立性した実行フローです。常规的には、並行して実行できるプロセスの軽量の個々のコンポーネントと見なすことができます。スレッド化は、基本、オペレーティング システムによって提高される機能です。同じメモリ空間を一共要するプロセス内に複数のスレッドが的存在する或许性があります。これは、実行されるコードとプログラムで宣言口号された変数を互为に一共要することを后果します。
これをよりよく看法するために、ラップトップで現在実行されているプログラムの例を考えてみましょう。おそらく、ブラウザで複数のタブを開いた状態でこの記事を読んでいるでしょう。その間、音楽を聴くために Spotify デスクトップ アプリを開いています。現在、ブラウザーと Spotify デスクトップ アプリは、複数のプロセスまたはスレッドを选用して並列処理を実現できる 2 つの別個のプロセスのようなものです。そのため、ブラウザーのさまざまなタブがさまざまなスレッドで実行される会性があります。同様に、Spotify は 1 つのスレッドを选用して音楽を再造し、別のスレッドを选用してインターネットからお気に入りの曲をダウンロードし、3 つ目のスレッドを选用してユーザー インターフェイスを说できます。そして、これはマルチスレッドと呼ばれます。
Python のマルチスレッドとは何ですか? マルチスレッドは、名前が示すように、複数のスレッドを同時に実行できるタスクまたは运行です。これは、複数のタスクを同時に立て続けに恰当化し、メイン スレッドを应用して複数のスレッド間でリソースをすばやく簡単に总共有できるようにする一般的的な技法です。
次の図は、Python でのマルチスレッドについて説明しています。
Python は線形言語ですが、Threading Python モジュールを用して、Python でのマルチスレッドの什么概念を能够理解し、実装することができます。 threading モジュールは、より多くの処理能力素质が有必要な場合に用できる複数のスレッドを簡単に生产する直感的な API を带来します。
下面に示すように运行できます。
import threading from queue import Queue import time def testThread(num): print num if __name__ == '__main__': for i in range(5): t = threading.Thread(target=testThread, arg=(i,)) t.start()
上記のコード スニペットでは、 target
が呼び出し可能なオブジェクトとして使用され、 args
は関数にパラメーターを渡し、スレッドをstart
するために使用されます。
さて、興味深いものがあります - ロックです。
グローバル通訳ロック プログラミングでは、スレッドに共通の変数をスレッドで変更または使用できるようにしたい場合がよくあります。ただし、これを行うには、Python でLock またはGlobal Interpreter Lock (GIL) と呼ばれるものを使用する必要があります。
パイソンから :
CPython では、グローバル インタープリター ロック ( GIL ) は Python オブジェクトへのアクセスを保護するミューテックスであり、複数のスレッドが Python バイトコードを一度に実行するのを防ぎます。このロックが必要なのは、主に CPython のメモリ管理がスレッドセーフではないためです。
インタープリター レベルでは、Python は基本上的に系统系统命令をシリアル化します。スレッドが関数を実行するには、まずグローバル ロックを具有する一定があります。直接にそのロックを具有できるスレッドは 1 つだけであるため、インタープリターは最終的に系统系统命令をシリアルに実行する一定があります。このアーキテクチャはメモリ管理系统をスレッドセーフにしますが、複数の CPU コアをまったく操作できません。
簡単に言えば、関数が変数を运行または変更する場合は常にその変数をロックし、他の関数がその某个の変数を运行または変更する場合は、その変数がロック结束されるまで待機する必不可少があります。
それぞれ変数を 1 ずつ反復する 2 つの関数を考えてみましょう。ロックを运行して、ある関数が変数を読み取り、計算を実行し、別の関数ができる前に変数に書き戻すことができるようにすることで、データの破損を防ぐことができます。
Python でのマルチスレッドの使用例 Python でのスレッド化は、CPU を集中式的に选择する机会性のあるタスクよりも、I/O 方法やスクリプトの実行などのネットワークにバインドされたタスクに役立ちます。たとえば、Web スクレイピングの場合です。もう 1 つの例は、スレッド プールを选择してデータを並列に変換するです。
これらのアプリケーション范围内に、グラフィカル ユーザー インターフェイス (GUI) は常にマルチスレッドを操作して、アプリケーションの応答性と対話性を高めています。普通的な例は、ユーザーがテキストを入力するとすぐに画面的に表达出来されるテキスト編集プログラムです。ここでは、另一立方のスレッドがユーザー入力を処理し、もう另一立方のスレッドがタスクを処理して表达出来します。スペルチェック、オートコンプリートなどの機能を追加するためにスレッドを追加できます。
スレッドについて詳しく説明したので、プロセスに移りましょう。
プロセスとは プロセスは、実行中のコンピュータ プログラムの単なるインスタンスです。各プロセスには、実行中のps命令を格納するために操作される自己のメモリ空間と、コードの実行のためにアクセスまたは格納する必要的があるデータがあります。このため、プロセスの绘制は、スレッドに比べて時間がかかり遅くなります。
上述のように、デスクトップで複数のアプリケーションを実行している場合、各アプリケーションはプロセスであり、これらのプロセスを同時に実行している場合、マルチプロセッシングと呼ばれます。
Python のマルチプロセッシングとは? マルチプロセッシングとは、複数の無関係なタスクを同時に実行するプロセッサの機能です。 Global Interpreter Lock (GIL) をバイパスして同時に実行できるプログラムを制成し、CPU コア通体を选用してタスクを効率的に実行できます。
マルチプロセッシングの慨念はマルチスレッドとは完全的に異なりますが、Python での構文や操作法は十分的に似ています。 Threading モジュールと同様に、Python には Multiprocessing モジュールがあり、さまざまなプロセスを转化するのに役立ちます。各プロセスには孤单の Python インタープリターと GIL があります。
プロセスは同じメモリを现有しないため、同じメモリを同時に変更することはできず、デッドロックに陥ったり、データが破損したりするリスクを避让できます。
下面に示すように用できます。
import multiprocessing def spawn(num): print(num) if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=spawn, args=(i,)) p.start() p.join() # this line allows you to wait for processes
Python でのマルチプロセッシングの使用例 前にも説明したように、マルチプロセッシングは、タスクが CPU を一大批に应用し、I/O 的方法やユーザーの的方法がない場合に適しています。
違い、メリット、デメリット マルチプロセッシングとマルチスレッドの違い、メリット、デメリットをまとめたポイントを次に示します。
スレッドは同じメモリ空間を共有しますが、各プロセスには独自のメモリ空間があります。 スレッド間でオブジェクトを共有する方が簡単ですが、2 つのスレッドが同時に同じオブジェクトに書き込みを行ったり、競合状態が発生したりしないように、オブジェクトの同期に対して特別な予防措置を講じる必要があります。 マルチスレッド プログラミングは、オブジェクト同期のためのプログラミング オーバーヘッドが追加されるため、マルチプロセッシングよりもバグが発生しやすくなります。 スポーン プロセスは、プロセスよりもオーバーヘッドが少ないため、スレッドよりも時間とリソースを消費します。 Python の GIL 制約により、スレッドは複数の CPU コアを活用して完全な並列処理を実現することはできません。マルチプロセッシングにはそのような制約はありません。 オペレーティング システムはプロセスのスケジューリングを処理しますが、Python インタープリターはスレッドのスケジューリングを処理します。 子プロセスは中断して強制終了できますが、子スレッドはできません。スレッドが終了または参加するまで待つ必要があります。
結論 この議論から、次の結論を導き出すことができます。
スレッド化は、IO またはユーザーの操作が必要なプログラムに推奨されます。 CPU バウンドで計算集約型のアプリの場合は、マルチプロセッシングを採用する必要があります。
Python のマルチプロセッシングとマルチスレッドがどのように動作し、それらがどのように比較されるかを的理解したので、コードを効果的に記述し、さまざまな状況で 2 つのアプローチを適用することができます。
この記事がお役に立てば幸いです。読み続けます!