[英]Arrange tasks in a certain order in python
我有一个字典,描述了一堆作业,这些作业将按一定顺序进行处理:
jobs = {
"job_a": {"commands": ["ls -a", "echo $LANG"], "dependencies": []}
"job_b": {"commands": ["ps aux", "find -name xxx"], "dependencies": []}
"job_c": {"commands": ["umask", "cat yyy"], "dependencies": ["job_a"]}
"job_d": {"commands": ["kill -9 www", "sed zzz"], "dependencies": ["job_b", "job_c"]}
}
每个作业项目中的依赖项列表确定了它们应执行的顺序:例如job_d
应该在job_b
和job_c
之后job_c
。
我需要的是一个指示这些工作顺序的列表,在上面的示例中,该列表可能是
jobs_order = ["job_a", "job_b", "job_c", "job_d"]
# or
jobs_order = ["job_a", "job_c", "job_b", "job_d"]
# or
jobs_order = ["job_b", "job_a", "job_c", "job_d"]
最简单的方法是遍历遍历jobs.items()
列表,然后每次将依赖项插入到前面的位置。
这里的工作量可能很大。 我们可以用更小的空间和更短的时间来做得更好吗?
它可能看起来像这样:
#!/usr/bin/env python3
from collections import defaultdict
from queue import SimpleQueue
def get_order(jobs):
q = SimpleQueue()
subtasks = defaultdict(list)
n_deps = {}
for key, job in jobs.items():
dependencies = job.get('dependencies', [])
n_deps[key] = len(dependencies)
if len(dependencies) == 0:
q.put(key)
for parent in dependencies:
subtasks[parent].append(key)
order = []
while not q.empty():
job = q.get()
order.append(job)
for key in subtasks[job]:
n_deps[key] -= 1
if n_deps[key] == 0:
q.put(key)
return order
def main():
jobs = {
"job_d": {"commands": ["kill -9 www", "sed zzz"], "dependencies": ["job_b", "job_c"]},
"job_c": {"commands": ["umask", "cat yyy"], "dependencies": ["job_a"]},
"job_b": {"commands": ["ps aux", "find -name xxx"], "dependencies": []},
"job_a": {"commands": ["ls -a", "echo $LANG"], "dependencies": []},
}
print(get_order(jobs))
if __name__ == '__main__':
main()
输出:
['job_b', 'job_a', 'job_c', 'job_d']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.