我使用的是Dancer 1.31,采用标准配置(plackup/Starman)。
在一个请求中,我希望异步调用perl函数,以便请求立即返回。想一想典型的“长时间运行的操作”场景,在这个场景中,人们想要返回一个带有refresh+redirect的“处理页面”。
我(天真?)尝试使用线程:
sub myfunc {
sleep 9; # just for testing a slow operation
}
any '/test1' => sub {
my $thr = threads->create('myfunc');
$thr->detach();
return "done" ;
};我无法工作,服务器似乎冻结了,错误日志没有显示任何内容。我猜在Dancer中手动创建线程是被禁止的?这是PSGI的问题吗?推荐的方式是什么?
发布于 2012-10-22 05:09:03
我会远离perl线程,尤其是在web服务器环境中。当你加入或分离它们时,它很可能会使你的服务器崩溃。
我通常在初始化其他模块之前创建一些线程(线程池),并在应用程序的整个生命周期中保留它们。Thread::Queue很好地提供了工作线程和主线程之间的通信。
我在Perl中找到的最好的异步解决方案是POE。在Linux中,我更喜欢使用POE::Wheel::Run异步运行可执行文件和子例程。它使用fork,并且有一个漂亮的界面,允许与子进程进行通信。(在Windows中,由于线程依赖,它不可用)
在同一应用程序/脚本中设置Dancer和POE可能会导致问题,并且POE的事件循环可能会被阻塞。一个专用于POE的工作线程可能会派上用场,或者我会基于POE编写另一个服务器,然后通过套接字与Dancer应用程序通信。
发布于 2014-07-20 00:38:21
线程对于Perl来说是绝对不可靠的。也许可以编写一些线程Dancer代码,但老实说,我认为我们还没有尝试过。考虑到Dancer1的核心使用simpleton类,这可能也是非常棘手的。
正如Ogla所说,在Dancer中还有其他方法来实现异步行为。您说您正在使用Starman,这是一个分叉引擎。但也有基于AnyEvent的Twiggy。要了解如何利用它来编写异步代码,请查看Dancer::Plugin::Async。
https://stackoverflow.com/questions/12992982
复制相似问题