在套接字编程中,您创建一个侦听套接字,然后对于每个连接的客户端,您将获得一个可用于处理客户端请求的普通流套接字.OS管理幕后传入连接的队列.
两个进程无法同时绑定到同一个端口 - 默认情况下,无论如何.
我想知道是否有一种方法(在任何着名的操作系统,特别是Windows上)启动进程的多个实例,这样它们都绑定到套接字,因此它们有效地共享队列.然后每个流程实例可以是单线程的; 它会在接受新连接时阻止.当客户端连接时,其中一个空闲流程实例将接受该客户端.
这将允许每个进程具有非常简单的单线程实现,除非通过显式共享内存,否则不会共享任何内容,并且用户将能够通过启动更多实例来调整处理带宽.
这样的功能是否存在?
编辑:对于那些问"为什么不使用线程?"的人 显然线程是一种选择.但是在单个进程中有多个线程,所有对象都是可共享的,并且必须非常小心以确保对象不是共享的,或者一次只对一个线程可见,或者是绝对不可变的,以及最流行的语言和运行时缺乏对管理这种复杂性的内置支持.
通过启动一些相同的工作进程,您将获得一个默认不共享的并发系统,从而使构建正确且可伸缩的实现变得更加容易.
我在阅读有关 Node js 中的集群的内容时遇到了一个简单的示例,而主文件创建了四个子进程,每个进程都监听 8080 端口。
代码运行良好,但我不明白:
如何让多个子进程监听同一个端口?
我期待收到这样的消息
错误:监听 EADDRINUSE:地址已在使用中 :::8080
const cluster = require("cluster");
if (cluster.isMaster) {
for (let i = 0; i <= 4; i++) cluster.fork();
} else {
require("./test.js");
}
Run Code Online (Sandbox Code Playgroud)
测试.js
const http1 = require("http");
http1
.createServer((req, res) => {
console.log("request1");
res.write("hello1");
res.end();
})
.listen(8080, () => {
console.log("begin");
});
Run Code Online (Sandbox Code Playgroud)