我不明白该程序为何起作用:
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…”;在这种情况下,“完成”不够吗?
如果我将“完成”替换为“退出”,则程序可以正常工作并退出。
答案 0 :(得分:4)
这只是一个猜测:
done
块中的whenever
发出信号,表明已为该whenever
供电。到那时,react
已准备好整体上完成,但它首先可以使其他补给物(如果有的话)可以完成。
首先,第一个whenever
的供给($supply
)每秒发出另一个值。当Promise.in(5)
的供应量为done
时,它将无法准备就绪。这样就完成了整个react
。
在第二种情况下,第一个whenever
的供给($supply
)立即发出另一个值。然后另一个。从来没有准备好。因此,整体react
从未完成。相反,react
一直在寻找第一个whenever
,因此,cue
是另一个块,然后重复数十亿次,而这些块再也无法实际运行并执行其{{1 }},因为系统太忙而产生了无数线程。