multithreading - 在perl中实现js setTimeout功能
问题描述
如何在 Perl 中实现 Javascript setTimeout 功能?这是我试图用 Perl 编写的一段 javascript 代码。这可以使用线程吗?
alert("Event 1 occured");
setTimeout(function(){ alert("3 seconds elapsed"); }, 3000);
alert("Event 2 occured");
输出是:
Event 1 occured
Event 2 occured
3 seconds elapsed
我有 perl 5.18.2,我在 Mac OSX 上
解决方案
不需要线程,而且在 Perl 中它们也不是很好。您可以像 JavaScript 一样使用事件循环,只是在 Perl 核心中没有。两个流行且得到良好支持的事件循环生态系统是IO::Async和Mojo::IOLoop(Mojolicious Web 框架背后的事件循环)。主要区别在于,与 JavaScript 不同,事件循环在启动之前不会运行。
use strict;
use warnings;
use IO::Async::Loop;
print "Event 1 occurred\n";
my $future = IO::Async::Loop->new->delay_future(after => 3)->on_done(sub { print "3 seconds elapsed\n" });
print "Event 2 occurred\n";
$future->await; # run event loop until Future has been resolved
use strict;
use warnings;
use Mojo::IOLoop;
print "Event 1 occurred\n";
Mojo::IOLoop->timer(3 => sub { print "3 seconds elapsed\n" });
print "Event 2 occurred\n";
Mojo::IOLoop->start; # run event loop until no more events to wait for
查看Mojolicious 食谱,了解事件循环和非阻塞代码的高级概述。
推荐阅读
- c - 我可以将所有函数参数(相同的编号、类型和顺序)转发到另一个函数吗
- c# - INotifyPropertyChanged 和反序列化
- haskell - 如何在 ihaskell 笔记本中设置 OverloadedStrings?
- xaml - 带有文本框和文本块的自定义控件
- javascript - 从 Blueimps Jquery 文件上传中的下载模板中单击的段落中获取 id
- java - Java 在读取流时抛出 InvalidClassException
- error-handling - InvalidStateError:尝试使用不可用或不再可用的对象?
- python - 有没有办法将 matplotlib 制作的图形打印到 csv 中?
- javascript - 为什么 Node.removeChild 会抛出错误?
- amazon-web-services - 云“翻译”指南