マルチプロセスとマルチスレッドの違い、メリットとデメリット(Python)


マルチプロセス
Linuxシステムでos.fork()を使用し、 1回呼び出され、2回返されます.オペレーティングシステムは、現在のプロセス(親プロセス)を自動的にコピーし(子プロセス)、親プロセスと子プロセスでそれぞれ返します.子プロセスは常に0を返し、親プロセスは子プロセスのIDを返します.これにより、親プロセスはforkで多くのサブプロセスを生成し、サブプロセスのID番号を記録することができ、サブプロセスはgetppid()で親プロセスIDを取得することができる.fork()はUnix/Linuxでのみ使用され、windowsでは使用できません.したがって、Pythonには、プラットフォームにまたがるパケットmutiprocessingが存在し、パケット内のProcessクラスを導入することによって、マルチプロセスプログラムを作成することができ、プロセスp=Process(target=func,args=(*,))を作成し、p.start() p.join()を利用して実行することができる.以上のjoin()メソッドは、サブプロセスが終了するまで下に実行することができ、通常、プロセス間同期に使用されます.さらに、プロセスプール、例えばp=Pool(n)、次いでp.apply_async(func,args)を用いることができ、ここではn種類の異なるパラメータを用いて入力し、異なるプロセスを確立することができる.このようにすると、join()メソッドを呼び出す前にclose()メソッドを呼び出し、新しいプロセスを追加できないようにします.mutiprocessingパッケージにはQueue,Pipeなど多様なプロセス間通信の方法が提供されている.Queueクラスを直接導入し、オブジェクトをインスタンス化できます.異なるプロセスはputメソッドを使用して情報を送信し、getメソッドを使用して情報を取得することができます.
マルチスレッド
複数のタスクは、オペレーティングシステムの直接的な実行ユニットである複数のプロセスを作成して完了するとともに、複数のスレッドを作成して完了することができます.Pythonはthreading
この高度なモジュールでは、スレッドを起動するには、関数をエクスポートしてThreadインスタンスを作成し、start()メソッドを呼び出して実行を開始します.たとえば、t=threading.Thread(target=func,name=*)
、ここのname属性に注意してください.スレッドに名前を付け、デフォルト値はThread-1・・・です.注意すべきは、さっき言ったように、どのプロセスにもスレッドが含まれていますが、このメインスレッドは私たちが作成したプログラムを実行しており、呼び出すことができます.threading.current_thread().name
見てみましょう.その名前はMainThreadです.マルチスレッドプログラミングでは、プロセス内のリソースが各スレッドで共有され、プロセス内の任意の変数が任意のスレッドで変更できるという最大の問題があります.したがって、スレッド間で同じ変数を変更すると、プログラムBugが発生する可能性があります.従って,ロック機構を導入した.あるスレッドが変数を修正する場合、変数が存在するメソッドにロックを追加することで、他のスレッドが同時にこのメソッドを実行できなくなり、ロックが解放された後、他のスレッドがロックを取得して修正権を得ることができます.ロックを作成するにはlock=threading.Lock()
実現するにはtry···finally···
文、tryの前に使用lock.acquire()
ロックを取得し、try文で変数を変更し、finally文に追加します.lock.release()
ロックが必ず解放され、デッドロックにならないようにします.
連絡と区別する
        マルチプロセスの利点は、安定性が高く、サブプロセスがクラッシュし、メインプロセスおよび残りのプロセスに影響を与えないことです.しかし、欠点は、オペレーティングシステムが各プロセスに固定されたリソースを割り当てるため、プロセスを作成するコストが非常に大きいことです.また、オペレーティングシステムはプロセスの総数に一定の制限があり、プロセスが多すぎると、オペレーティングシステムのスケジューリングに問題があり、偽死状態になります.
        マルチスレッドの利点は、効率が高いことですが、致命的な欠点は、プロセスのメモリリソースプールを共有しているため、どのスレッドがクラッシュしてもプロセス全体がクラッシュする可能性があります.タスク数では、マルチプロセスでもマルチスレッドでも、あまり多くはできません.オペレーティングシステムはタスクを切り替える時、一連の保護現場措置があるため、これは相当なシステム資源を費やし、タスクが多すぎると、大部分の資源がこれらに使われ、結果としてすべてのタスクがうまくいかないため、オペレーティングシステムはプロセスの数を制限する.また,計算集約型およびIO集約型アプリケーションを考慮する.コンピューティングが密集している場合、マルチタスクはリソースの浪費をもたらすに違いありません.IO密集型では,IO速度がCPU計算速度よりはるかに低いため,マルチタスク方式を用いることでプログラム実行効率を大幅に向上させることができる.