执行外部程序后更改 $*SCHEDULER 时出现奇怪的行为

fin*_*fin 11 rakudo raku

描述

有一个例子:

#!/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在错误之前打印,有时在错误之后打印,有时不打印。我没有找到这样的模式。

问题

  1. 这是一个错误吗?
  2. 这个错误是什么意思以及为什么会出现?
  3. 为什么之后还会发生这种情况exit 0

Eli*_*sen 8

有一个默认设置$*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)

所以回答你的问题:

  1. 不,这是 DIHWIDT 的案例

  2. 往上看

  3. 我想这是一个时间问题,尽管这有点令人费解。我的猜测是, 是cue用于处理 的结果run,而不是其run本身。因此它开始执行,启动后,它发现它实际上无法向处理程序提示run.