Python でシンプルなマルチプレイヤー ゲームを作成しています。Python のデフォルトのスレッド モジュールを使用してプロセスを分割しました。ただし、プログラムは他のスレッドの速度でまだ遅くなることに気付きました。multiprocessing モジュールを使用してみましたが、すべてのオブジェクトをピクルできるわけではありません。
同時プロセスを実行するために multiprocessing モジュールを使用する代わりの方法はありますか?
Python でシンプルなマルチプレイヤー ゲームを作成しています。Python のデフォルトのスレッド モジュールを使用してプロセスを分割しました。ただし、プログラムは他のスレッドの速度でまだ遅くなることに気付きました。multiprocessing モジュールを使用してみましたが、すべてのオブジェクトをピクルできるわけではありません。
同時プロセスを実行するために multiprocessing モジュールを使用する代わりの方法はありますか?
他のスレッドが作業を行っているときに、プログラムの速度が低下する理由を分析する必要があります。スレッドが CPU 集中型の作業を行っていると仮定すると、スローダウンはグローバル インタープリター ロックによってシリアル化されているスレッドと一致します。
スレッドが実行している作業の性質と、並行して共有する必要があるオブジェクトの性質について詳しく知らずに、詳細に回答することは不可能です。一般に、実行可能なオプションは 2 つあります。
通常、マルチプロセッシング モジュールを介してプロセスを使用します。オブジェクトが picklable でない一般的な理由は、クロージャ、開いているファイル ハンドル、またはその他のシステム リソースなどの picklable できない状態がオブジェクトに含まれているためです。しかし、pickle では、状態を使用してオブジェクトを再構築し、オブジェクトの状態を識別する__getstate__
ようなメソッドをオブジェクトに実装できます。__reduce__
オブジェクトが巨大であるために pickle 化できない場合は、それらを共有メモリまたはメモリ マップ ファイルに格納する C 拡張を記述し、共有メモリでオブジェクトを識別するキーのみを pickle 化する必要がある場合があります。
スレッドを使用して、GIL を回避する方法を見つけます。計算がいくつかのホット スポットに集中している場合は、それらのホット スポットを C に移動し、計算中に GIL を解放できます。これが機能するためには、計算で Python オブジェクトを参照してはなりません。つまり、GIL が保持されている間にすべてのデータをオブジェクトから抽出し、GIL が再取得された後に Python ワールドに格納し直す必要があります。
オプションは次のとおりです。
MPI4PY: http://code.google.com/p/mpi4py/
セロリ: http://www.celeryproject.org/
Pプロセス: http://www.boddie.org.uk/python/pprocess.html
並列 Python (PP): http://www.parallelpython.com/