25

私はpythongeventを始めたばかりで、ライブラリのcpu/mulitcoreの使用法について疑問に思っていました。

モンキーパッチを適用したurllibを介して多くのリクエストを実行するいくつかの例を試してみると、99%の負荷を使用して1つのコアでのみ実行されていることがわかりました。

Pythonを使用してgeventですべてのコアを使用するにはどうすればよいですか?ベストプラクティスはありますか?または、複数のプロセスとgeventを使用した場合の副作用はありますか?

BRダン

4

1 に答える 1

61

Geventを使用すると、ブロック要求を処理できます。マルチコアで実行することはできません。

Pythonプロセスで実行されているグリーンレット(geventのコルーチン)は常に1つだけです。geventの本当の利点は、I / Oボトルネック(一般的なWebアプリ、APIエンドポイントを提供するWebアプリ、Webベースのチャットアプリまたはバックエンド、および一般的にネットワーク化されたアプリの場合に通常当てはまります)を処理するときに非常に強力になることです。 )。CPUを大量に消費する計算を行う場合、geventを使用してもパフォーマンスは向上しません。アプリがI/Oバウンドの場合、geventは純粋な魔法です。

簡単なルールが1つあります。I/O操作がブロックされるとき、または明示的に切り替えを行うとき(gevent.sleep()など)に、グリーンレットが切り替えられます。

組み込みのPythonスレッドは、実際にはgeventのグリーンレットと同じ(疑似)「並行」の方法で動作します。

主な違いはこれです-グリーンレットは協調マルチタスクを使用し、スレッドはプリエンプティブマルチタスクを使用します。つまり、グリーンレットは、特定の「yielding」関数(gevent.socket.socket.recvやgevent.sleepなど)を使用しない限り、実行を停止して別のグリーンレットに「yield」することはありません。

一方、スレッドは、オペレーティングシステムがいつスワップアウトするかを決定したときに基づいて、他のスレッドに(場合によっては予期せずに)譲ります。

そして最後に、Pythonでマルチコアを利用するには(それが必要な場合)、マルチプロセッシングモジュール(Pythonの組み込みモジュール)に依存する必要があります。これは「GILを回避する」。他の選択肢には、Jythonを使用するか、タスクキュー(Zeromqなど)を使用してタスクを並列に(異なるCPUで)実行することが含まれます。

私はここに非常に長い説明を書きました-http://learn-gevent-socketio.readthedocs.org/en/latest/。あなたが詳細に飛び込むことを気にするなら。:-D

于 2013-03-25T14:39:05.247 に答える