如何使用Perl同时处理部分任务顺序?

时间:2011-11-25 10:21:58

标签: multithreading perl concurrency perl-data-structures

我有一组部分有序的任务,其中对于每个任务,在执行之前必须执行在部分顺序中严格位于其之前的所有任务。我想同时执行不相关的任务(在一个之前或之后)以尝试最小化总执行时间 - 但是在完成依赖之前没有启动任务。

任务将作为(非perl)子进程运行。

我应该如何使用Perl解决这样的问题?什么是并发控制工具和数据结构?

2 个答案:

答案 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在最大值时休眠产生了多少个工作。

由于您已经在处理单独的进程,因此不涉及任何线程。

阅读第一个链接,了解可能的算法/启发式方法,以确定可运行作业的优先级。