我有一组部分有序的任务,其中对于每个任务,在执行之前必须执行在部分顺序中严格位于其之前的所有任务。我想同时执行不相关的任务(在一个之前或之后)以尝试最小化总执行时间 - 但是在完成依赖之前没有启动任务。
任务将作为(非perl)子进程运行。
我应该如何使用Perl解决这样的问题?什么是并发控制工具和数据结构?
答案 0 :(得分:1)
我会使用数组哈希。对于每个任务,将在相应的数组中提及其所有先决条件:
$prereq{task1} = [qw/task2 task3 task4/];
我会将完成的任务保存在不同的哈希中,然后只需
my @prereq = @{ $prereq{$task} };
if (@prereq == grep exists $completed{$_}, @prereq) {
run($task);
}
答案 1 :(得分:1)
看起来完整的解决方案是NP-complete。
对于部分解决方案,我会使用某种形式的引用计数来确定哪些作业可以运行,Forks::Super::Job运行后台作业并检查其状态,并POSIX::pause在最大值时休眠产生了多少个工作。
由于您已经在处理单独的进程,因此不涉及任何线程。
阅读第一个链接,了解可能的算法/启发式方法,以确定可运行作业的优先级。