舞者中的线程

时间:2012-10-20 21:43:42

标签: perl dancer

我在标准配置(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的一个问题?推荐哪种方式?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

使用Perl确定线程很明显。有可能写一些线程的舞者代码,但说实话,我认为我们没有尝试过。考虑到Dancer 1的核心使用的是简单类,它也可能非常棘手。

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