【问题标题】:Forking to Run Code in a Child Process With Perl's Dancer使用 Perl 的 Dancer 在子进程中分叉运行代码
【发布时间】:2012-11-28 21:12:15
【问题描述】:

我在 perl 中有一个 Dancer 应用程序,用于处理 get/post 请求。

我的一个示例路线如下:

post '/handle_data' => sub {

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

我的问题:有没有一种简单的方法可以在另一个进程中执行长时间运行的任务而不阻塞请求?

我在父进程中尝试了fork and return,在子进程长时间运行的任务之后使用exit,但这似乎阻止了响应发送,直到子进程完成。

感谢任何帮助。

编辑:

我最终切换到一个成熟的作业服务器,特别是 Gearman 的 perl 版本

【问题讨论】:

    标签: perl perl-module fork dancer


    【解决方案1】:

    分叉和返回似乎对我有用。

    我试过了:

    #!/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/Starman 运行,按预期工作 - “内容!\n”立即返回到用户的浏览器,请求结束;分叉的进程挂起十秒钟休眠,然后发出警告(在终端上可见)然后退出。

    【讨论】:

    • 通过试错调试,这就像我想象的那样工作。我的问题是我在响应标头之前打印出调试信息... :)
    • 对此我有一个疑问:这个是fork整个dancer进程还是仅仅fork路由下的函数?我不熟悉 perl 中的线程,但我在许多项目中都使用过 Dancer,这可能会在一段时间内有用。
    • 它分叉了整个过程;这就是为什么在我的示例中需要 exit 的原因,否则分叉的子进程一旦离开路由处理程序,可能会等待新的连接。
    • @DavidPrecious 我在分叉和退出时遇到问题......一旦我开始使用这种方法,我看到很多 plackup 工作人员被列为已失效。
    • @Blaskovicz 那是因为没有“收割者”。像这样的东西应该异步处理$SIG{CHLD} = sub { wait };
    猜你喜欢
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 2018-07-13
    • 1970-01-01
    相关资源
    最近更新 更多