2012-11-28 54 views
1

我在perl中有一個處理get/post請求的Dancer應用程序。用Perl的舞者在子進程中分叉運行代碼

我的一個示例將在下面:

post '/handle_data' => sub { 

    # perform some calculations 
    ... 
    # store some data 
    ... 
    # do some long running tasks 
    ... 
}; 

我的問題:有一個簡單的方法來做到在另一個進程長時間運行的任務,而不會阻塞請求?

我已經嘗試fork and return在父進程中,exit後長兒童運行任務,但似乎都阻止發送的響應,直到孩子完成。

任何幫助表示讚賞。

編輯:

我最終切換到一個完整的作業服務器,具體的Gearman

回答

3

perl的版本叉和回報似乎爲我工作。

我想:

#!/usr/bin/perl 

use Dancer; 

get '/' => sub { 
    fork and return "Content!\n"; 

    sleep 10; # do your actual work here 
    warn "Child process done\n"; 
    exit; 
}; 

dance; 

運行是通過獨立的服務器,或者通過plackup /接龍,按預期工作 - 將立即返回到用戶的瀏覽器,並且請求是「內容\ n」!過度;分叉進程掛起十秒鐘,然後發出警告(終端上可見)然後退出。

+0

經過反覆試驗調試,這個工程,我以爲會。 我的問題是,我在響應頭之前打印出調試信息...... :) – Blaskovicz

+0

我對此有疑問:這是否分叉整個舞者流程或只是路線下的功能?我不熟悉perl中的線程,但是我爲許多項目使用了舞者,這在一段時間內可能會有用。 – Demnogonis

+1

它分化了整個過程;這就是爲什麼你需要我的例子中的'exit',否則分叉的子進程一旦離開路由處理器就可能等待新的連接。 –