【问题标题】:How do I process a partial order of tasks concurrently using Perl?如何使用 Perl 同时处理部分任务顺序?
【发布时间】:2012-01-06 05:54:30
【问题描述】:

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

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

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

【问题讨论】:

  • 作弊:您还可以编写一个 Makefile 来描述依赖关系并执行例如make -j 4 最多 4 个并发工作人员。

标签: multithreading perl concurrency perl-data-structures


【解决方案1】:

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

$prereq{task1} = [qw/task2 task3 task4/];

我会将已完成的任务保存在不同的哈希中,然后只是

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

【讨论】:

    【解决方案2】:

    看起来完整的解决方案是NP-complete

    至于部分解决方案,我会使用某种形式的引用计数来确定哪些作业已准备好运行,Forks::Super::Job 运行后台作业并检查它们的状态,POSIX::pause 在最大作业数为时休眠产生。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多