1

我在标准配置(plackup/Starman)中使用 Dancer 1.31。

在请求中,我希望异步调用 perl 函数,以便请求立即返回。想想典型的“长时间运行的操作”场景,其中一个人想要返回一个带有刷新+重定向的“处理页面”。

我(天真地?)尝试了一个线程:

sub myfunc {  
   sleep 9; # just for testing a slow operation
}

any '/test1' => sub {
   my $thr = threads->create('myfunc'); 
   $thr->detach();
   return "done" ;
};

我不工作,服务器似乎冻结了,错误日志没有显示任何内容。我猜 Dancer 内部禁止手动创建线程?是PSGI的问题吗?推荐的方法是什么?

4

2 回答 2

1

我会远离 perl 线程,尤其是在 web 服务器环境中。当您加入或分离它们时,它很可能会使您的服务器崩溃。

我通常在初始化其他模块之前创建几个线程(线程池),并在应用程序的整个生命周期中保留它们。Thread::Queue很好地提供了工作线程和主线程之间的通信。

我在 Perl 中找到的最好的异步解决方案是POE。在 Linux 中,我更喜欢使用POE::Wheel::Run来异步运行可执行文件和子例程。它使用 fork 并具有漂亮的界面,允许与子进程进行通信。(在 Windows 中,由于线程依赖性,它不可用)

在同一个应用程序/脚本中设置 Dancer 和 POE 可能会导致问题,并且 POE 的事件循环可能会被阻塞。一个专用于 POE 的工作线程可能会派上用场,或者我会编写另一个基于 POE 的服务器并通过套接字与 Dancer 应用程序通信。

于 2012-10-21T21:09:03.440 回答
1

线程在 Perl 中是绝对不确定的。也许可以编写一些线程化的 Dancer 代码,但老实说,我认为我们从未尝试过。而且考虑到 Dancer 1 的核心使用 simpleton 类,它也可能非常棘手。

正如 Ogla 所说,还有其他方法可以在 Dancer 中实现异步行为。你说你正在使用 Starman,这是一个分叉引擎。但也有基于 AnyEvent 的Twiggy 。要了解如何利用它来编写异步代码,请查看Dancer::Plugin::Async

于 2014-07-19T16:38:20.580 回答