Pythonでマルチプロセッシングをデバッグする


回答:


6

真のマルチプロセッシングPythonプログラム(恐ろしいGILを処理しなければならないマルチスレッド Pythonプログラムとは対照的に)は、他のどの言語のプログラムとも違いはありません。それらはすべて同じ基本的な課題を持っています:

  1. タスクの割り当てと結果の報告。ほとんどが独立したデータセットで作業している場合でも、通常はマスタースレッドに戻って結果を報告し、新しいデータを取得する必要があります。これはチョークポイントになる可能性があります。
  2. レースコンディション。プロセスは一度に1つのリソースを使用しようとしているため、相互のデータをステップ実行しないようにmutex(または同様のもの)を使用する必要があります。これらの種類のリソースの保護に失敗すると、デバッグセッションが非常に苦痛になります。
  3. シーケンシャル。時々、平行ではない何かを作ろうとします。さまざまなプロセスがお互いに何かをするのを待ってしまい、最終的な結果は、すべての意図と目的のために、シーケンシャルプログラムを取得し、それを並列にし、それでも線形時間(またはそれ以上)で実行されることになります。

これらの各問題を回避しようとする開発方法がありますが、結局のところ、あなたは本当に自分が何をしているのかを考える必要があります。大規模なデモの途中や実稼働中とは対照的に、これらの機会の窓にぶつかり、開発中に爆発する可能性が十分にあるように、実際の生活で起こると思われるものをはるかに超える重いストレステストをお勧めします。

我々はマイクロ秒、タイムスタンプのログファイルを使用するために使用して、我々ができるようアプリを表示して色分けされたログを作成してみてください Mプロセッサ上で実行されているNプロセスの間起こっていたものを視覚化します。また、クラッシュのコンテキストを再作成するためにログファイルを削除するシステムを作成することも試みました(そしてほとんど成功しました)。

しかし、最良のツールは優れたデザインであり、アプリを水中から吹き飛ばそうとする本当に邪悪で厄介な人々です。(こんにちは、ベル!)


25

私が非常に役立つと思うことの1つは、multiprocessingモジュールで既存のロガーを使用することです。あなたのメインコードでこれを試してください:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

参照:http : //docs.python.org/library/multiprocessing.html#logging

さらに、次を使用して現在のプロセス名にアクセスできます。

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

参照:http : //docs.python.org/library/multiprocessing.html#multiprocessing.current_process

それ以外は、pdb&coのような標準のデバッグ方法以外には何も知りません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.