简单的非阻塞Web服务器

时间:2016-12-26 16:25:00

标签: sockets perl6

我正在尝试使用Perl6创建一个简单的非阻塞Web服务器,但我很可能在这里不明白。

实施例

10+3

此处的示例与文档https://docs.perl6.org/type/IO::Socket::Async

中的通用示例几乎相同

问题:

为什么页面不是以并行方式提供,而是按顺序提供给所有客户端?

1 个答案:

答案 0 :(得分:2)

在这里回答我自己的问题。我是perl6的初学者,所以如果我在这里做一些奇怪的事情,请修理我。

使用promises似乎解决了这个问题。我以前认为IO :: Socket :: Async会为我创建promise,而请求将由模块并行处理。

#!/usr/bin/env perl6

use v6;

my @promises;
react {
    whenever IO::Socket::Async.listen('0.0.0.0', 8080) -> $conn {
        whenever $conn.Supply(:bin) -> $buf {
            my $promise = start {
                say "-" x 70 ~ "\n" ~ $buf.decode('UTF-8').trim-trailing;
                sleep 5;
                my $response = "HTTP/1.0 200 OK\x0D\x0A\x0D\x0A";
                $response ~= q:to/END/;
                    <html>
                    <head>
                        <title>Demo page</title>
                    </head>
                    <body>
                    <h1>Title here</h1>
                    <p>lorem ipsum here</p>
                    </body>
                    </html>
                    END
                await $conn.write: $response.encode('utf-8');
                $conn.close();
            };
            push @promises, $promise;
        }
    }
}
await @promises;