目前我正在介绍worker_threads
我正在开发的游戏。Thea 的想法是将每个游戏室放在一个单独的线程中,以便可以并行处理它们(是的,我知道只有在线程数不超过内核数的情况下才会真正发生这种情况)。
但是,我无法socket.io
使用worker_threads
. 到目前为止,我已经尝试了以下方法:
1.在socket.io
服务器内创建服务器:
服务器.js
const { Worker, isMainThread } = require("worker_threads");
const express = require("express");
const app = express();
app.use(express.static(__dirname));
app.post("/newGame", (request, response) => {
let roomCode = request.query.room_code;
const worker = new Worker("./server-worker.js", {
workerData: {
roomCode: roomCode
},
});
});
app.listen(8080, () => {
console.info("Server started on http://localhost:8080");
});
server-worker.js
const { parentPort, workerData, threadId } = require("worker_threads");
const server = require("http").createServer();
const io = require("socket.io")(server);
server.listen(8080, () => {
console.info("Server socket.io on port 8080");
});
io.on("connection", (socket) => {
console.log(`Client with ID ${socket.id} connected to thread with ID ${threadID}`);
});
这会导致浏览器记录以下内容:
GET http://localhost:8080/socket.io/?EIO=3&transport=polling&t= 404 (Not Found)
此外,即使我让 Express 将轮询请求转发给工作人员,我猜我也无法打开多个房间,因为端口已经在使用中。
2.在主线程中创建socket.io
实例并传递它
服务器.js
const { Worker, isMainThread } = require("worker_threads");
const express = require("express");
const app = express();
app.use(express.static(__dirname));
const server = require("http").createServer(app);
const io = require("socket.io")(server);
app.post("/newGame", (request, response) => {
let roomCode = request.query.room_code;
const worker = new Worker("./server-worker.js", {
workerData: {
roomCode: roomCode,
io: io
},
});
});
但是,这不起作用,因为我得到了一个DataCloneError
,因为 worker_threads 只能将本机对象发送给工作人员。
问题:
- 有没有更简单的方法来完成我正在做的事情?即:我只是使用了错误的框架吗?
- 有没有办法
socket.io
使用线程?我已经看到了有关使用 Redis 实例将它与 node.js 集群一起使用的文档,但这对于手头的问题来说似乎有点过分了,因为我没有多个进程/节点。