对序列中的供应做出反应

时间:2019-03-10 15:29:21

标签: sequence perl6

我不明白该程序为何起作用:

my $supply = Supply.interval: 1;

react {
  whenever $supply       { put "Got $^a"  }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'

打印此内容:

Got 0
Got 1
Got 2
Got 3
Got 4
Timeout!
Ending…

并正确退出,而这一步:

my $supply = (1, 1, * + * … ∞).Supply;

react {
  whenever $supply       { put "Got $^a"; sleep 1 }
  whenever Promise.in(5) { put 'Timeout!'; done }
}

END put 'Ending…'

打印

Got 1
Got 1
Got 2
Got 3
Got 5
Timeout!

,但是它挂起并且不输出“ Ending…”;在这种情况下,“完成”不够吗?

如果我将“完成”替换为“退出”,则程序可以正常工作并退出。

1 个答案:

答案 0 :(得分:4)

这只是一个猜测:

done块中的whenever发出信号,表明已为该whenever供电。到那时,react已准备好整体上完成,但它首先可以使其他补给物(如果有的话)可以完成。

首先,第一个whenever的供给($supply)每秒发出另一个值。当Promise.in(5)的供应量为done时,它将无法准备就绪。这样就完成了整个react

在第二种情况下,第一个whenever的供给($supply)立即发出另一个值。然后另一个。从来没有准备好。因此,整体react从未完成。相反,react一直在寻找第一个whenever,因此,cue是另一个块,然后重复数十亿次,而这些块再也无法实际运行并执行其{{1 }},因为系统太忙而产生了无数线程。