有一个例子:
#!/bin/env raku
run 'raku', '-e', 'say "ok"';
exit 0;
my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 128);
Run Code Online (Sandbox Code Playgroud)
在linux上的输出是:
ok
Unhandled exception in code scheduled on thread 4
No such method 'cue' for invocant of type 'Any'
Run Code Online (Sandbox Code Playgroud)
在 Windows 上输出是:
Unhandled exception in code scheduled on thread 4
No such method 'cue' for invocant of type 'Any'
in method throw at 'SETTING::'src/core.c/Exception.pm6 line 65
in method schedule_thens at 'SETTING::'src/core.c/Promise.pm6 line 167
in method keep at 'SETTING::'src/core.c/Promise.pm6 line 127
in method keep at 'SETTING::'src/core.c/Promise.pm6 line 83
in block at 'SETTING::'src/core.c/Proc/Async.pm6 line 390
in block at 'SETTING::'src/core.c/ThreadPoolScheduler.pm6 line 263
in method run-one at 'SETTING::'src/core.c/ThreadPoolScheduler.pm6 line 244
in block at 'SETTING::'src/core.c/ThreadPoolScheduler.pm6 line 308
in sub THREAD-ENTRY at 'SETTING::'src/core.c/Thread.pm6 line 69
Run Code Online (Sandbox Code Playgroud)
有时它ok在错误之前打印,有时在错误之后打印,有时不打印。我没有找到这样的模式。
exit 0?有一个默认设置$*SCHEDULER,因为所有异步功能都依赖于此。
通过$*SCHEDULER向该范围添加 a ,您将覆盖它,我认为这是您的意图。
然而,在运行时run,它还没有设置:它是Any。因此,run尝试cue执行命令的操作,但没有可用的调度程序来提示这一点。
修复?确保在执行之前run设置调度程序:
my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 128);
run 'raku', '-e', 'say "ok"';
exit 0;
Run Code Online (Sandbox Code Playgroud)
所以回答你的问题:
不,这是 DIHWIDT 的案例
往上看
我想这是一个时间问题,尽管这有点令人费解。我的猜测是, 是cue用于处理 的结果run,而不是其run本身。因此它开始执行,启动后,它发现它实际上无法向处理程序提示run.