私たちはしばしばベテランを聞いて、最近のマルチスレッドのPythonを見て言った:「!pythonのマルチスレッドの下に無味である、マルチプロセスを使用することをお勧めします」しかし、なぜあなたは言うのですか?
これらを知るために、なぜ知っています。次の綿密な研究とそう:
まず、背景を強調:
1.どのようなGILはい?GILはグローバルインタプリタロック(グローバルインタプリタロック)の略で、ソースが作られたデータセキュリティ上の決定のために、Pythonの設計の始まりと考えられています。
図2に示すように、各CPUが唯一のシングルコアCPU内の1つのスレッド(マルチスレッドを実行することができると同時にだけではなく、複数の要求の概念の両面処理するためにマクロから同時並列、同時平行で実際にあるが、同時および分化平行同時に発生し、2枚以上の平行なイベントを指し、同時に二つ以上のイベントを指すは、同じ時間間隔内に起こります)
Pythonの複数のスレッドでは、実行モードの各スレッド:
1. GIL取得し
、睡眠やPython仮想マシンがハングアップするまで2.コードの実行を。
3.リリースGIL
スレッドを見て、実行しようと、あなたは最初に「合格」として、およびPythonのプロセス、GIL一つだけでGIL、我々はできるGILを取得する必要があります。CPUに許可されていないスレッドを渡す取得できません。
各リリース後GIL、ゼロを専門に、パイソン自体はカウンタとして見ることができるダニ(現在のIO操作数を満たすためにGIL論理スレッドの放出が100に到達またはダニにpython2.xでは、このことによってカウントすることができます)調整sys.setcheckinterval、リリースされます。
そして、各リリースGILロック、スレッドのロック競合、切り替えスレッドは、リソースを消費します。そしてためGILロックの存在により、プロセスにおけるPythonはしかマルチコアCPU上で、マルチスレッドPythonの効率が高くない理由である、(GILを実行するスレッドを取得する)、同時にスレッドを実行することができます。
これは、マルチスレッドのpythonが完全に役に立たないですないですか?
ここでは、分類について説明します。
図1に示すように、CPU集中コード(様々なループ処理、計数、等)、この場合には、カウントがすぐに閾値に達するダニ、次いでさらに競争GILの放出(もちろん複数のスレッドをトリガし、トグルを消費する必要がありますリソース)、とてもPythonで複数のスレッドがCPU集約型のコードに友好的ではありません。
2、IO集中コード(文書処理、ウェブクローラなど)、有効(IO操作の効率を向上させることができるマルチスレッドは、IOは時間の不必要な浪費をもたらす、単一のスレッドを待つ必要となり、スレッドAを待機複数のスレッドを開くことができ自動的に)プログラムの実行効率を向上させることができるCPUリソースを無駄にすることなく、スレッドBに切り替えます。だから、pythonのマルチスレッドIO集約型のコードのための、よりフレンドリー。
python3.xでGILは、ダニ(実行時間しきい値に達した後、現在のスレッドはGILを解放する)代わりに、タイマーを使用して、カウントするので、CPU集約型のプログラムをより親しみやすいが、それでものみGILを引き起こした同じ時間に対応していませんを使用していない、でこれは、実行のスレッドを発行することができますので、効率はまだ不十分です。
シングルコアマルチスレッドよりも悪いマルチスレッドマルチコア、マルチスレッド核形成が単一の理由、各リリースGILであり、そのスレッドはGILロックを取得することができる目を覚ます、シームレスに実行することができるが、GIL後に放出マルチコア、CPU0において、他のCPUのスレッドで競争しますが、状態にスケジュールされるスイッチング時間後に目覚めべき目覚め待ちになりますすぐにGILはCPU上のいくつかの他のスレッドで、その結果、CPU0を得ることができ、これは、スレッドのスラッシングが発生しますより低い効率をもたらす(スラッシング)、
戻る問題の先頭に:私たちはしばしばベテランを聞いて言った:それは何であるため、「Pythonは次のマルチプロセスを使用するように、マルチコアCPUをフルに活用したいですか」?
理由:あなたが真の意味で並列に実行できるようにPythonで、効率は(のみマルチコアCPU用語の)マルチプロセス、マルチスレッドよりも優れているように、各プロセスは、お互いを乱すことなく、独自の独立したGILを有しています。
だからここに結論を言う:マルチコアは、並列効率を改善したかった、より一般的なアプローチが効果的、効率を向上させることができ、マルチプロセスを使用することです
パイソンマルチプロセスコード例:
インポートマルチプロセッシング のPdとしてインポートPANDASを DEFのprocess_split_df(行): データ処理の#メソッド パス この#データフレームを、我々は彼らのニーズに応じた処理を作成 DF = pd.DataFrame() #ゲットマシンの数の現在のCPU POOL_SIZE = multiprocessing.cpu_count( ) #分割だけ作成データフレーム df_split = np.array_split(DF、POOL_SIZE) #コースのプールに投入 プール= multiprocessing.Pool(プロセス= POOL_SIZE)は 、データの各列を処理する方法である#マルチプロセスが開始され、process_split_dfに合流 result_dfをpd.concat =(pool.map(process_split_df、df_split)) pool.close() pool.join()
---------------------
免責事項:この記事は、元の記事のCSDNブロガー「ゆうL」で、BY-SA著作権契約をCC 4.0に従う、転載を添付してください元のソースのリンクと、この文。
オリジナルリンクします。https://blog.csdn.net/lambert310/article/details/50605748