我正在编写一个 python 脚本(用于 cygwin 和 linux 环境)来对使用 subprocess.Popen() 从命令行运行的程序运行回归测试。基本上,我有一组作业,其中一部分需要根据开发人员的需要运行(大约 10 到 1000 个)。每项工作可能需要几秒钟到 20 分钟才能完成。
我的作业在多个处理器上成功运行,但我试图通过智能地排序作业(基于过去的性能)以首先运行更长的作业来节省一些时间。复杂之处在于,某些作业(稳态计算)需要先于其他作业(基于稳态确定的初始条件的瞬态)运行。
我目前的处理方法是在同一个进程上递归地运行父作业和所有子作业,但有些作业有多个长期运行的子作业。父作业完成后,我想将子代添加回池中以供其他进程使用,但需要将它们添加到队列的头部。我不确定我可以用 multiprocessing.Pool 做到这一点。我用 Manager 找了一些例子,但它们似乎都是基于网络的,并不是特别适用。任何以代码形式提供的帮助或指向关于多处理的好教程的链接(我已经用谷歌搜索了......)将不胜感激。这是到目前为止我所拥有的代码的骨架,评论指出我希望在其他处理器上产生的子作业。
import multiprocessing
import subprocess
class Job(object):
def __init__(self, popenArgs, runTime, children)
self.popenArgs = popenArgs #list to be fed to popen
self.runTime = runTime #Approximate runTime for the job
self.children = children #Jobs that require this job to run first
def runJob(job):
subprocess.Popen(job.popenArgs).wait()
####################################################
#I want to remove this, and instead kick these back to the pool
for j in job.children:
runJob(j)
####################################################
def main(jobs):
# This jobs argument contains only jobs which are ready to be run
# ie no children, only parent-less jobs
jobs.sort(key=lambda job: job.runTime, reverse=True)
multiprocessing.Pool(4).map(runJob, jobs)