2012-10-20 37 views
1

我在標準配置(plackup/Starman)中使用Dancer 1.31。Dancer中的線程

在請求我希望異步調用perl的功能,使請求inmmediately返回。想想典型的「長時間運行」場景,其中一個想要返回帶有刷新+重定向的「處理頁面」。

我(?天真地)試圖用一個線程:

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

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

我不工作,服務器似乎停止了,錯誤日誌不顯示任何東西。我猜Dancer中禁止手動創建線程?這是PSGI的問題?推薦的方式是?

+1

fork,而不是線程。 – MkV

+0

@MkV是的,我明白了...你可以補充一點,作爲答案。 – leonbloy

+0

@leonbloy,你最後做了什麼? –

回答

1

我會留在Perl線程遠離尤其是在Web服務器環境。當您加入或分離它們時,很可能會導致服務器崩潰。

我通常創建幾個線程(線程池)之前初始化等模塊,並保持周圍的應用程序的整個生命週期。 Thread::Queue很好地提供了工作人員和主線程之間的通信。

最好的解決方案異步我在Perl找到的是POE。在Linux中,我更喜歡使用POE::Wheel::Run異步運行可執行文件和子例程。它使用叉子,並有一個漂亮的界面,允許與子進程進行通信。 (在Windows它不是可用由於線程相關)

建立舞者和POE相同的應用程序/腳本中可能會引起問題和POE的事件循環可能被堵塞。專用於POE的單個工作線程可能會派上用場,或者我會根據POE編寫另一個服務器,並通過套接字與Dancer應用程序通信。

1

線程完全可以用Perl來處理。編寫一些線程化的Dancer代碼可能是可能的,但說實話我不認爲我們曾經嘗試過。考慮到舞者1的核心使用傻瓜類,它可能也非常棘手。

由於Ogla說,有落實在舞者異步行爲的其他方式。你說你在使用Starman,這是一個分叉引擎。但也有Twiggy,這是基於AnyEvent的。要了解如何利用它來編寫異步代碼,請參考Dancer::Plugin::Async