一連のタスクを受け取り、それらをクラスター上の異なるスレッドまたは異なるノードに分散する Python コードがあります。driver.py
私はいつも2 つのコマンド ライン引数を取るメイン スクリプトを書くことになります:--run-all
と--run-task
. driver.py --run-task
1 つ目は、すべてのタスクを反復処理し、引数として渡された各タスクで呼び出す単なるラッパーです。例:
== driver.py ==
# Determine the current script
DRIVER = os.path.abspath(__file__)
(opts, args) = parser.parse_args()
if opts.run_all is not None:
# Run all tasks
for task in opts.run_all.split(","):
# Call driver.py again with a specific task
cmd = "python %s --run-task %s" %(DRIVER, task)
# Execute on system
distribute_cmd(cmd)
elif opts.run_task is not None:
# Run on an individual task
# code here for processing a task...
次に、ユーザーは次のように呼び出します。
$ driver.py --run-all task1,task2,task3,task4
そして、各タスクが分散されます。
この関数distribute_cmd
は、シェル実行可能コマンドを受け取り、システム固有の方法でノードまたはスレッドに送信します。driver.py
独自の名前を見つけて自分自身を呼び出さなければならない理由はdistribute_cmd
、実行可能なシェル コマンドが必要だからです。たとえば、関数名を取ることはできません。
この考慮事項により、2 つのモードを持ち、それ自体を呼び出さなければならないドライバー スクリプトの設計にたどり着きました。これには 2 つの複雑な問題があります。(1) スクリプトはそれ自身のパスを経由して見つける必要が__file__
あり、(2) これを Python パッケージにする場合、どこdriver.py
に行くべきかが不明です。これは実行可能なスクリプトであることを意図していますが、setup.py
'sに入れるとscripts=
、スクリプトがどこにあるかを見つける必要があります ( Python distutils の setup.py からスクリプト ディレクトリを見つける正しい方法を参照してください)。これは良い解決策ではないようです。
これに代わるデザインは何ですか?タスクの分散は、文字列として に渡すことができる実行可能なコマンドになる必要があることに注意してdistribute_cmd
ください。ありがとう。