我想每秒打印当前时间,并且还想每5秒睡眠10秒:
react {
whenever Supply.interval(1) {
say DateTime.now.posix;
}
whenever Supply.interval(5) {
sleep 10;
say 'Sleep Done';
}
whenever signal(SIGINT) {
say "Done.";
done;
}
}
输出不是我想要的:
1542371045
Sleep Done
1542371055
Sleep Done
1542371065
Sleep Done
1542371075
Done.
...
我想要的是这样的:
1542371045
1542371046
1542371047
1542371048
1542371049
Sleep Done
1542371059
1542371060
1542371061
1542371062
1542371063
Sleep Done
Done.
不太了解Promise
, Supply
……关于Raku,这可能吗?
根据具体需要,我可能会这样写:
react {
sub sequence() {
whenever Supply.interval(1).head(5) {
say DateTime.now.posix;
LAST whenever Promise.in(10) {
say "Sleep done";
sequence();
}
}
}
sequence();
}
其输出如下:
1542395158
1542395159
1542395160
1542395161
1542395162
Sleep done
1542395172
1542395173
1542395174
1542395175
1542395176
Sleep done
1542395186
1542395187
1542395188
...
这将绝对确保您在 10 秒暂停之间获得 5 个滴答声;使用两个独立的间隔电源来实现这一点(就像这里的许多解决方案一样)不会对此给出任何严格的保证,并且可能会时不时地错过一个滴答声。 (其中一个没有的是可爱的,rotor
,如果您不需要实际打印“睡眠完成”的内容,这是一个不错的选择)。它也没有状态(变量)和条件,这是相当好的。
虽然这looks就像它可能是递归的,因为whenever
是一个异步循环构造,它实际上根本不会构建调用堆栈。
它也是完全由异步构造构建的,因此在 Perl 6.d 中不会 - 如果react
在线程池上触发 - 永远阻塞真正的操作系统线程。所以你可能有数千个这样的活动。相比之下,sleep
会阻塞一个真正的线程,这就是sleep
传统上预计会这样做,但如果以其他方式处理异步构造,则不太适合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)