Multithreading 如何使用Perl并发处理任务的部分顺序?

Multithreading 如何使用Perl并发处理任务的部分顺序?,multithreading,perl,concurrency,perl-data-structures,Multithreading,Perl,Concurrency,Perl Data Structures,我有一组部分排序的任务,其中对于每个任务,所有严格按照部分顺序排列在它前面的任务都必须在执行之前执行。我希望同时执行不相关的任务(在一个任务之前或之后),以尽量减少总的执行时间,但在完成依赖项之前不启动任务 这些任务将作为(非perl)子进程运行 我应该如何使用Perl解决这样的问题?有哪些并发控制设施和数据结构可用?我将使用数组散列。对于每个任务,其所有先决条件都将在相应的数组中提及: $prereq{task1} = [qw/task2 task3 task4/]; 我会将完成的任务保存在

我有一组部分排序的任务,其中对于每个任务,所有严格按照部分顺序排列在它前面的任务都必须在执行之前执行。我希望同时执行不相关的任务(在一个任务之前或之后),以尽量减少总的执行时间,但在完成依赖项之前不启动任务

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


我应该如何使用Perl解决这样的问题?有哪些并发控制设施和数据结构可用?

我将使用数组散列。对于每个任务,其所有先决条件都将在相应的数组中提及:

$prereq{task1} = [qw/task2 task3 task4/];
我会将完成的任务保存在不同的散列中,然后

my @prereq = @{ $prereq{$task} };
if (@prereq == grep exists $completed{$_}, @prereq) {
    run($task);
}

看起来一个完整的解决方案是

至于部分解决方案,我将使用某种形式的引用计数来确定哪些作业已准备好运行,运行后台作业并检查其状态,以及在生成最大数量的作业时休眠

不涉及线程,因为您已经在处理单独的进程


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

作弊:您还可以编写一个Makefile来描述依赖关系,并对最多4个并发工作者执行例如
make-j4