这是一个后续问题,何时signal()以反应块顺序依赖? 。
以下使用默认调度程序的代码$*SCHEDULER使用户可以在以下事件循环中按CTRL-C来立即退出:
use v6;
my %scheduler;
my $use-default-scheduler = True;
if $use-default-scheduler {
%scheduler = scheduler => $*SCHEDULER;
}
react {
whenever signal(SIGINT, |%scheduler) {
say "Got signal";
exit;
}
whenever Supply.from-list($*IN.lines, |%scheduler) {
say "Got line";
exit if $++ == 1 ;
}
}
Run Code Online (Sandbox Code Playgroud)
我对在同一react循环中使用两个不同的线程调度程序会发生什么感兴趣?如果我通过使用以上代码中的设置Supply.from-list()来使用默认的线程调度程序,而不是。现在,用户无法通过按立即退出该块。如果他按了该程序,则仅挂起该程序,直到按Enter。$*SCHEDULER$use-default-scheduler = FalsereactCTRL-CCTRL-C
那么,这里实际发生了什么?是否react一次只关注一个事件循环?(我在这里想象两个事件循环,一个用于默认调度程序,第一个whenever用于SIGINT信号,另一个用于$*IN.lines电源)。因此,react现在将重点放在from-list()调度程序上,$*IN.lines但是在此事件循环中以某种方式忽略了SIGINT吗?那么按CTRL-C不改变react块的状态吗?
在我的Perl 6脚本中,我想对标准输入进行(最好是非阻塞)检查以查看数据是否可用.如果是这种情况,那么我想处理它,否则我想做其他的事情.
示例(consumer.p6):
#!/usr/bin/perl6
use v6.b;
use fatal;
sub MAIN() returns UInt:D {
while !$*IN.eof {
if some_fancy_check_for_STDIN() { #TODO: this needs to be done.
for $*IN.lines -> $line {
say "Process '$line'";
}
}
say "Do something Else.";
}
say "I'm done.";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
作为STDIN-Generator我写了另一个Perl6脚本(producer.p6):
#!/usr/bin/perl6
use v6.b;
use fatal;
sub MAIN() returns UInt:D {
$*OUT.say("aaaa aaa");
sleep-until now+2;
$*OUT.say("nbbasdf");
sleep-until now+2;
$*OUT.say("xxxxx");
sleep-until now+2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果consumer.p6按预期工作,它应该产生以下输出,如果通过以下方式调用./producer.p6 | ./consumer.p6 …