Pythonの、マルチプロセス、マルチスレッド、コルーチン

プロセス:

  プログラム(コード)がないコードと呼ばれるプログラムを実行して、プロセスを実行して、プロセスは、システムリソースの割り当ての最小単位であり、プロセスは、独自の独立したメモリ空間を有しているので、データを処理、大きなオーバーヘッドとの間で共有されていません。

スレッド:

  実行のためにスケジュールされた最小ユニットは、また、実行パスと呼ばれる、独立して存在することができず、プロセスに依存するプロセスは、少なくとも1つのスレッドが有している、メインスレッドと呼ばれ、共有メモリの複数のスレッド(データ共有、共有グローバル変数)は、大幅に改善プログラムの効率。

コルーチン:

  ユーザーは完全にユーザによって制御される軽量スレッドの状態、コルーチンスケジューリングで、コルーチンは独自のスタックを持っていて、コンテキストコルーチンスケジューリングを切り替えて登録します。カットバックするとき、他の場所へのレジスタコンテキストとスタックを保存し、以前に保存されたレジスタのコンテキストとスタックを復元するには、直接営業費用は、基本的には、カーネルスタックの切り替えは、グローバル変数にアクセスするためにロックを解除することはできない、そんなにコンテキスト切り替え速いです。

どのようなスレッドの競争?

  非独立したスレッドは、スレッドは、各スレッドの方位データリソースが競合状態になり、データの共有、同じプロセスです。  

    データ同期がほとんどデータの混乱で、その結果、複数のスレッドによって占有され、スレッドセーフな、いわゆる、その後、どのようにマルチスレッドの競合を解決するには? - ロック

 ロックの利点:

    アトミック複数行の大会で操作上の問題を解決するために始めから終わりまでのスレッドだけを完全に実装することにより、その特定の重要なコード(共有データリソース)を確保するために。

 ロック短所:  

     これは致命的な問題をロックし、実質ロック含むコードの断片は単一スレッドモードで行うことができ、効率が大幅に低減され、複数のスレッドの同時実行を防止する:デッドロック。

 

マルチプロセス:

  Linuxシステムでは、二度、一度呼び出さ返され、()os.forkを使用して、オペレーティングシステムが自動的に現在のプロセス(親)(子プロセス)のコピーを入れ、その後、親プロセスと子プロセスの中に戻しました。息子は常に、0を返し、子プロセスの親プロセスIDを返し、そうした後、親が(フォークすることができるようになります)子プロセス多くのことを、そして子プロセスのIDを記録することができました。子供はgetppid()によってしばしば親IDを取得することができる、フォーク()UNIX / Linuxのにのみ使用され、ウィンドウは、プロセス・パッケージを導入することによって、Pythonで、(mutiprocessing)クロスプラットフォームのパッケージがあり、従って、ではありませんこのクラスには、マルチプロセスのプログラムを作成することができます。

  あなたはp.start()とp.join()メソッドは、子プロセスダウン終了後まで待つことができます()。ターゲット= FUNC、引数の=(*)プロセスp =プロセスを作成し、使用することができ、一般的にプロセス間で使用同期。さらに、プロセスは、プールの方法、例えばP =プール(N)。そしてp.apply_asunc(FUNC、引数)を使用することができ、本明細書で使用されるn個の異なるパラメータが異なるプロセスを作成するために渡すことができる、このようにして使用される場合、 join()メソッドの前に、最初に近い()メソッドを呼び出し、バッグ、プロセスQeue、パイプや他のピアの様々な中で方法を提供mutipeocessing、それは不可能、新しいスレッドを追加することを呼び出します。キュークラスは、オブジェクトをインスタンス化し、直接導入することができ、プロセスは、方法は、情報を取得するために使用されてもよい別の方法は、情報を入れて使用することができます。

 

マルチスレッド:

  あなたは、複数のタスクを完了するために複数のプロセスを作成することができます、だけでなく、完了するために複数のスレッドを作成することができ、ユニットが直接実行されるオペレーティングシステムスレッドは、スレッドを開始するには、この高度なモジュールを含むPythonのスレッドは、広がりや関数を作成することですインスタンスをスレッド、その後、スタートの例では、T = threading.Thread(対象= FUNC、名前= *)のために、開始するために()メソッドを呼び出し、ここのスレッド、デフォルト値のスレッドに命名された名前の属性を、注意してください - 1 .. ... なお、ちょうど)任意のプロセスは、一つのスレッドが含まれている、私たちが書くプログラムを実行するメインスレッドは、あなたが(threading.current_thread呼び出すことができる、と述べた。名前()彼を見て、それが名前だがMainThreadと呼ばれています。

  より多くのスレッドプログラミングは、最大の問題は、プロセス内のリソースは、さまざまなスレッドを共有していることがあるされているのと同じ変数を変更する場合、プロセス内の任意の変数は、スレッド間、従って、いずれかのスレッド修正することができます。これは、バグのプログラムなので、ロック機構の導入、一つのスレッドが変数を変更するときに、他のスレッドが唯一のロックを解除し、同時に、この方法を実行できないように、あなたは、その変数が配置されている方法でロックを追加することができますが発生することがあり変更する権利を得るために、別のスレッドの後。

  ... threading.Lockが実装=ロック()、それは試す使用することができてロックを作成し、最後に...試し中の文... lock.acquireは()ロックを取得し、内部のステートメントを変更しようとする前に、ロックが解除されなければならないことを確保するための変数、そして最終的にはリガlock.closeは()、それはデッドロックを避けるために言及しました。

 

違いとの関係:

  マルチプロセスの安定性の利点は、子プロセスがクラッシュ良いです。あまりにプロセスならば、それはメインプロセスと他のプロセスに影響を与えませんが、オペレーティングシステムは、各プロセスへのリソースの固定割り当てを与えること、およびオペレーティングシステムの総数は、プロセスに一定の制限がありますので、欠点は、非常に大きなを作成するプロセスのコストですオペレーティングシステムが問題をスケジュールされますが、それは仮死状態になります。

  マルチスレッドは少し高い効率の優位性であるが、彼らはプロセスメモリのリソースプールを共有するため、致命的な欠陥は、任意のスレッドのクラッシュは、プロセス全体の崩壊をもたらしたことです。タスクを切り替えるときは、そのような、あまりにも多くのタスクとして、かなりのシステムリソースを取るサイトを保護するための一連の措置で構成され、オペレーティングシステムので、それはマルチプロセスまたはマルチスレッドであるかどうかをタスクの数については、あまりにも多くのことはできません。リソースのほとんどはドライそれらとして使用されています。その結果、すべてのタスクがよくやっているということです。だから、オペレーティングシステムは、計算集約型のための計算集約型およびIO集約型アプリケーションを考慮し、加えて、プロセスの数を制限することができIOのCPU速度が算出された速度よりもはるかに低いので、マルチタスクは必然的にそう、IO集約型のために、資源の無駄になります大幅に処理効率を高めることができるマルチタスクモードを使用します。

   コルーチンは、また糸、英語名のコルーチンとして知られています。

    Pythonでコルーチンは、マルチタスキング、実行ユニットの値を達成するための別の方法であるが、(必要なリソースとして理解される)占有スレッドよりも小さいです。彼はCPUコンテキストをつなぐため、なぜそれが、実行単位です。限り適切な時間として、我々はコルーチンを運ぶためにコルーチンスイッチを入れることができます。限り、プログラムやCPUのコンテキストを保存または復元するには、このプロセスを実行することができますよう、

    場合は、独自のデータ・キャッシュようにキャッシュを実行している各スレッドのCPUそう単純で、効率的なオペレーティング・システムからコンテキストを保存し、復元するよりも、マルチタスク、スレッド切り替えシステムレベルはるかに、オペレーティングシステムを使用すると、これらのデータを行うのに役立ちますリカバリ操作。第二のスイッチシステムは万回に行くのですそのために非常に時間が、パフォーマンスを切り替えるスレッドが、CPUの簡単な操作だけスイッチングコルーチンのコンテキストを消費します。

 

  コルーチン - >ウェブクローラー「の別の実装」のスレッドを開くことなく、複数のタスクを完了するためのスレッドのために

  コルーチンは、特殊な発電機であります

  yeild戻り値ジェネレータ

  yeildコルーチン(ノーリターン値コルーチン)

  greenletコルーチンが達成されたが、これは手動で切り替える必要があった、そのあまりにも面倒ではない、心配しないで、Pythonは私がgevent自動的greenletタスクスイッチングモジュールよりも強力で有能なを持っています

  原理はgreenletはIOが発生した場合、ネットワークにアクセスするように、動作中に(例えば、ネットワーク、ファイル操作などの入力、出力、入力と出力を参照)することである、それは自動的に他のgreenletに切り替わり、IO操作は、適切な時間集結完了するまで続けるに戻すIO操作は非常に時間がかかるので、私たちはgreenlet実行ではなくIOを待っているよりも、常にあることを保証するためにgeventが自動的にコルーチンを切り替えると、多くの場合、待機状態でプログラムを作ります。

  要約:

    図1は、リソース割り当て処理の単位であります

    図2に示すように、オペレーティング・システムのスレッドスケジューリング部

    3、必要な大規模なリソースの切り替え処理、非効率的

    (GILを考慮しない)4、スレッドスイッチは、一般的にリソースを必要とし、一般的な効率

    5、私は、タスク切り替えのリソースをコルーチン小型、高効率であります

    CPUコアの数に応じて6は、マルチプロセス、マルチスレッド、平行にそうではないが、コルーチンはスレッドであり、それによって複雑になります 

 

 

 

 

 

 

   

おすすめ

転載: www.cnblogs.com/jcjc/p/11588933.html