如何控制线程数?

时间:2017-08-28 15:20:36

标签: perl6

#The @url.elems >= 10000
    for @url -> $url {
       start {
          say $url;
          sleep(1);
       }
    }

如何控制线程数?

2 个答案:

答案 0 :(得分:11)

在回答问题之前:您显示的代码会丢失Promise返回的start。你可能想要:

await do for @url -> $url {
   start {
      say $url;
      sleep(1);
   }
}

这将等到所有起始块都完成。

回到你的问题:在将程序运行到将要创建的最大线程数之前,可以设置环境变量RAKUDO_MAX_THREADS。(默认为16)。

另一种在运行时也能运行的方法是动态创建一个新的ThreadPoolScheduler对象:

my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 32);

任何可以看到此$*SCHEDULER版本的线程代码现在都将使用此调度程序,该调度程序有32个可用线程。

答案 1 :(得分:2)

如果您在阵列中有大量作业并想要并行处理它们,请查看hyperrace。 (目前标记为'实验',它们将在下一个主要版本中更好地工作。)

通过它们,您可以(可能)使用“批量”控制并行性。和'度'参数。

@url.race(:batch(1),:degree(4)).map(-> $url {
    say $url;
    sleep(1);
});

当然,它们受ThreadPoolScheduler的整体线程限制。