【发布时间】:2019-08-11 09:46:45
【问题描述】:
我想运行多个 shell 进程,但是当我尝试运行超过 63 个时,它们会挂起。当我将线程池中的max_threads 减少到n 时,它会在运行nth shell 命令后挂起。
正如您在下面的代码中看到的,问题不在于start 块本身,而在于包含shell 命令的start 块:
#!/bin/env perl6
my $*SCHEDULER = ThreadPoolScheduler.new( max_threads => 2 );
my @processes;
# The Promises generated by this loop work as expected when awaited
for @*ARGS -> $item {
@processes.append(
start { say "Planning on processing $item" }
);
}
# The nth Promise generated by the following loop hangs when awaited (where n = max_thread)
for @*ARGS -> $item {
@processes.append(
start { shell "echo 'processing $item'" }
);
}
await(@processes);
运行./process_items foo bar baz 给出以下输出,在processing bar 之后挂起,就在nth(这里是2nd)线程有使用shell运行:
Planning on processing foo Planning on processing bar Planning on processing baz processing foo processing bar
我做错了什么?或者这是一个错误?
在 CentOS 7 上测试的 Perl 6 发行版:
乐道之星 2018.06
乐道之星 2018.10
乐道之星 2019.03-RC2
乐道之星 2019.03
对于 Rakudo Star 2019.03-RC2,use v6.c 与 use v6.d 没有任何区别。
【问题讨论】:
-
启动循环块
start {say "Starting $item"; loop (my $i=0; $i<100000; $i++) {state $a++;} }会运行到池中的最大线程数。如果作业多于线程,则其余的等待空闲线程,然后按预期执行。对于我的两分钱,你的问题突出了一个错误。 -
@drclaw 谢谢!我已经更新了我的问题,试图强调它何时工作(如您所展示)和它看起来“有问题”之间的区别。
标签: raku