首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >舞者中的线程

舞者中的线程
EN

Stack Overflow用户
提问于 2012-10-21 05:43:42
回答 2查看 700关注 0票数 1

我使用的是Dancer 1.31,采用标准配置(plackup/Starman)。

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

我(天真?)尝试使用线程:

代码语言:javascript
复制
sub myfunc {  
   sleep 9; # just for testing a slow operation
}

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-10-22 05:09:03

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

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-07-20 00:38:21

线程对于Perl来说是绝对不可靠的。也许可以编写一些线程Dancer代码,但老实说,我认为我们还没有尝试过。考虑到Dancer1的核心使用simpleton类,这可能也是非常棘手的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12992982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档