我有 python 代码,它需要一堆任务并将它们分发到集群上的不同线程或不同节点。我总是最终编写一个主脚本driver.py
,它需要两个命令行参数:--run-all
和--run-task
. 第一个只是一个包装器,它遍历所有任务,然后调用driver.py --run-task
每个任务作为参数传递。例子:
== 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
接受一个 shell 可执行命令,并以系统特定的方式发送到节点或线程。之所以driver.py
要找到自己的名字并调用自己是因为distribute_cmd
需要一个可执行的shell命令;例如,它不能采用函数名称。
这种考虑导致我设计了一个具有两种模式并且必须调用自身的驱动程序脚本。这有两个复杂性:(1)脚本必须找到自己的路径 via__file__
和(2)在将其制作成 Python 包时,不清楚driver.py
应该去哪里。它应该是一个可执行脚本,但如果我把它放在setup.py
'sscripts=
中,那么我将不得不找出脚本所在的位置(请参阅从 Python distutils 中的 setup.py 查找脚本目录的正确方法?)。这似乎不是一个好的解决方案。
有什么替代设计?请记住,任务的分配必须产生一个可执行的命令,该命令可以作为字符串传递给distribute_cmd
. 谢谢。