6

multi-threading私のほとんどの理解では、すべてではありませんが、ほとんどの場合、プログラミングを推進するのはパフォーマンス要因です。(Java または Python に関係なく)。

SOでこの啓発的な記事を読んでいました。GILこの記事では、python がGILメカニズムを採用していることを要約しています。つまり、いつでもsingle Thread実行できるのは a だけです。python byte codeこれにより、single threadアプリケーションが非常に高速になります。

私の質問は次のとおりです。

Thread特定の時点で1つしか提供されない場合、multiprocessingまたはthreadモジュールはGILによって課されたこの制限を克服する方法を提供しますか? multi-taskそうでない場合、実際の作業を行うためにどのような機能が提供されますか?

承認された回答の上記投稿のコメント欄に質問がありましたが、回答はありませんか? 私も心の中でこの疑問を持っていました

^so at any time point of time, only one thread will be serving content to client... 
so no point of actually using multithreading to improve performance. right?
4

4 に答える 4

12

CPUは1つのスレッドでしか使用されないため、マルチスレッドを使用してCPUバウンドの計算を行う意味はありません。

しかし、前のステートメントはあなたを啓発したかもしれません: あなたの計算が CPU バウンドでないなら、マルチスレッドを利用するかもしれません。

典型的な例は、アプリケーションがほとんどの時間を何かの待機に費やしている場合です。

CPU バウンドでないプログラムの多くの例の 1 つ: Web クローラーを構築したいとします。多くの Web サイトをクロールし、それらをデータベースに保存する必要があります。時間はどれくらいかかりますか? サーバーがデータを送信するのを待って、実際にデータをダウンロードし、データベースに保存します。ここでは CPU バウンドはありません。ここでは、単一のクローラーの代わりにクローラーのプールを使用して、より高速なクローラーを取得できます。通常、1 つの Web サイトがほとんどダウンしており、応答が非常に遅い場合 (~30 秒)、この間、シングルスレッド アプリケーションは Web サイトを待機し、スタックします。マルチスレッド アプリケーションでは、他のスレッドがクロールを続けますが、これはすばらしいことです。

一方、プロセスごとに 1 つの GIL があるため、マルチプロセッシングを使用して CPU バウンドの計算を行うことができます。

補足として、GIL を使用しない Python の多かれ少なかれ部分的な実装がいくつか存在します。何かクールなものを実現するのに最適な方法であると私が思うものに言及したいと思います: pypy STM。「GIL を取り除こう」と検索すると、このテーマに関する多くのスレッドを簡単に見つけることができます。

于 2014-07-14T20:00:52.043 に答える
2

マルチプロセッシングは GIL の問題を回避します。これは、GIL が単一のプロセスのみに関係しているのに対し、コードは別のプロセスで実行されるためです。プロセス内では、スレッドがディスクやネットワークなどの比較的低速なリソースを待機している限り、マルチスレッドの方が高速になる場合があります。

于 2014-07-14T19:55:53.293 に答える
1

GIL は Python では常にホットなトピックですが、通常は意味がありません。これにより、ほとんどのプログラムがより安全になります。本当の計算パフォーマンスが必要な場合は、PyOpenCL を試してください。現代の現実世界の高性能数値計算は、GPU で実行する必要があります (openCL は CPU でも問題なく実行されます)。GILの問題はありません。

I/O バウンドのパフォーマンスを改善するために Python でマルチスレッドを実行する場合、GIL は問題になりません。

最後に、複数の CPU を利用して純粋な数値計算のパフォーマンスを向上させたい場合は、pythonic の方法で multiprocessing を使用します。

ただし、マルチスレッド アプリケーションをアセンブリでコーディングするほど高速ではありません。タイプミスをしないで頑張ってください。

于 2014-07-14T20:14:25.160 に答える