相关疑难解决方法(0)

在同一react块中使用不同的线程调度程序时会发生什么?

这是一个后续问题,何时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块的状态吗?

asynchronous perl6 raku

11
推荐指数
1
解决办法
244
查看次数

Perl6:检查STDIN是否有数据

在我的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 …

perl6

6
推荐指数
1
解决办法
192
查看次数

标签 统计

perl6 ×2

asynchronous ×1

raku ×1