sockets - 简单的非阻塞 Web 服务器

标签 sockets raku

我正在尝试使用 Perl6 制作一个简单的非阻塞 Web 服务器,但很可能我不明白这里的某些内容。

示例:

#!/usr/bin/env perl6

use v6;

react {
    whenever IO::Socket::Async.listen('0.0.0.0', 8080) -> $conn {
        whenever $conn.Supply(:bin) -> $buf {
            say "-" x 70 ~ "\n" ~ $buf.decode('UTF-8').trim-trailing;
            sleep 5; # HERE
            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();
        }
    }
}

此处的示例与文档 https://docs.perl6.org/type/IO::Socket::Async 中的通用示例几乎相同

问题:

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

最佳答案

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

使用 promise 似乎可以解决这个问题。我之前假设 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;

关于sockets - 简单的非阻塞 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41333782/

相关文章:

list - 允许方法对我的类型列表进行操作?

java - 套接字与 Metro WS-安全复杂性

c - socket() 函数调用的有效返回值是 0 还是 1

mongodb - 如何为 MongoDB 服务器从属副本指定套接字超时

raku - 为什么默认的 Raku if/while/loop/when block 都具有相同的标识值 (.WHICH)?

r - 在 Rmarkdown 中执行 Perl 6 代码

c - Unix 套接字 : Client stops receiving messages correctly after first message

java - server.accept() 时发生了什么

perl - 获取当前进程的 perl 可执行文件的绝对路径

raku - 预编译 xxx 中可能的版本偏差