【问题标题】:Dancer: deal with multiple requests simultaneouslyDancer:同时处理多个请求
【发布时间】:2013-05-16 10:04:14
【问题描述】:

这是我的情况:我正在使用 Dancer 框架开发一个 Web 应用程序,我想从浏览器端向服务器端的数据库中插入一些数据。问题是,当数据太大时,上传需要很长时间,我正在考虑显示一个描述进度的进度条。

我通过发送两个请求来实现这一点:一个用于发布数据,另一个用于轮询状态。但是似乎一旦处理了第一个请求,另一个请求将在第一个请求完成之前不起作用。所以状态没有返回任何东西,突然 100%。为了解决这个问题,我在处理第一个请求时创建了一个线程,因此主线程可以返回来处理第二个轮询请求。这工作得很好,直到我不得不杀死在子线程中产生的一些子进程(这是another question)。

所以我的问题是,除了多线程请求之外,还有其他关于同时处理多个请求的想法吗?通常网络程序员是如何处理这种情况的?

【问题讨论】:

    标签: perl dancer


    【解决方案1】:

    同时处理多个请求应该没有问题。 你如何运行你的应用程序?如果您使用内置服务器 (perl your_app.pl),则默认情况下它是单线程的,一次只处理一个请求。

    您可能希望使用多进程/多线程部署选项,例如 Starman。描述于https://metacpan.org/module/YANICK/Dancer-1.3113/lib/Dancer/Deployment.pod#Running-on-Perl-webservers-with-plackup

    【讨论】:

    • 如果不指定服务器类型,plackup默认使用什么?
    • 除非环境自动检测发现其他东西(如metacpan.org/pod/Plack::Loader 中所述),否则我相信使用了 HTTP::Server::PSGI。
    【解决方案2】:
    【解决方案3】:

    您可以将 Dancer 与 plackupStarman 一起使用,这是一个示例:

    foo.psgi:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use Dancer2;
    
    $| = 1;
    
    get '/foo' => sub {
        `sleep 5`;
        'ok';
    };
    
    to_app;
    

    使用plackup运行程序:

    $ plackup -s Starman foo.pl
    Resolved [*]:5000 to [0.0.0.0]:5000, IPv4
    Binding to TCP port 5000 on host 0.0.0.0 with IPv4
    Setting gid to "0 0 0"
    Starman: Accepting connections at http://*:5000/
    

    然后运行以下for循环:

    for i in $(seq 1 3)
    > do
    >   time curl http://localhost:5000/foo &
    > done
    

    输出:

    ok
    real    0m5.077s
    user    0m0.004s
    sys 0m0.010s
    ok
    real    0m5.079s
    user    0m0.001s
    sys 0m0.012s
    ok
    real    0m5.097s
    user    0m0.009s
    sys 0m0.004s
    

    你可以看到 Dancer2 现在可以接受多个请求了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 2018-02-23
      • 1970-01-01
      • 2015-03-12
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多