Pool
frommultiprocessing
パッケージ(from multiprocessing.dummy import Pool
)を使用しています。テキストファイルを読み取り、将来の関数のために前処理する関数を作成しました。私は約20,000のそのようなテキストファイルを持っているので、プロセスを並列化したかったので、このためにプールを使用しました。コードを実行しているリモートサーバーに32個のコアがあるため、70個のプロセスを開こうとしました(これも試しませんでしたが、問題は残ります)。これがシステムモニターの外観です。
ご覧のとおり、32コアのうち16コアはまったく機能しません。
どんな助けでもいただければ幸いです。
コメントで述べたように、すべてのmultiprocessing.dummy
構造は、テスト、デバッグ、プロファイリングなどに非常に役立つ通常のスレッドを使用してマルチプロセッシングインターフェイスをシミュレートすることを目的としています。または、公式ドキュメントにあるように:
multiprocessing.dummy
のAPIを複製しますがmultiprocessing
、threading
モジュールのラッパーにすぎません。
Python(CPython)threading
は実際のシステムスレッドを使用するため、理論的には、スレッド化されたコードを異なるCPUで実行することが可能です。これは、恐ろしいGILにより、これらのスレッドの2つが同時に実行されることはありません。そのルールには例外があります。システムコールを抽象化し、イベント(I / Oなど)を待機するすべてのタスクは並行して実行できますが、処理がPythonドメインに移動すると、GILによってロックアウトされ、実行されません。 opt-codeカウンターがコンテキストを切り替えるまで実行を継続できます。
簡単に言うと、multiprocessing
プールを介して複数のコアを利用する場合は、multiprocessing.dummy
(他のdummy
パッケージにも当てはまります)の適応と抽象化を使用せず、ルートmultiprocessing
モジュール自体を使用します-あなたの場合はmultiprocessing.pool.Pool
。
ことではことを考えると、言っthreading
モジュールは、私は頻繁に自分自身を使用して見つけるのインターフェイスプールが付属していませんmultiprocessing.dummy.Pool
(またはmultiprocessing.pool.ThreadPool
共有メモリがより重要であるとき、I / O重いもの(すなわちGILによって制限されない)のための代わりに)共有処理と発生するオーバーヘッド。multiprocessing.pool.Pool
ファイルを取得するときに重い後処理を行わなければ、スイッチを切り替えても大きな違いに気付かない可能性があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加