我正在调试多线程 Node.js 实例之间的 IPC 实现。 由于本身不支持数据报套接字,因此我使用默认的流协议,并进行简单的应用程序级打包。 当两个线程通信时,服务器端总是接收,客户端总是发送。
// writing to the client trasmitter
// const transmitter = net.createConnection(SOCKETFILE);
const outgoing_buffer = [];
let writeable = true;
const write = (transfer) => {
if (transfer) outgoing_buffer.push(transfer);
if (outgoing_buffer.length === 0) return;
if (!writeable) return;
const current = outgoing_buffer.shift();
writeable = false;
transmitter.write(current, "utf8", () => {
writeable = true;
write();
});
};
// const server = net.createServer();
// server.listen(SOCKETFILE);
// server.on("connection", (reciever) => { ...
// reciever.on("data", (data) => { ...
// ... the read function is called with the data
let incoming_buffer = "";
const read = (data) => {
incoming_buffer += data.toString();
while (true) {
const decoded = decode(incoming_buffer);
if (!decoded) return;
incoming_buffer = incoming_buffer.substring(decoded.length);
// ... digest decoded string
}
};
我的流在传输包中进行编码,并解码回来,数据 JSON 来回字符串化。
现在发生的情况是,由于 CPU 负载较高时似乎更频繁,incoming_buffer 会时不时地获得一些随机字符,在记录时显示为 ��� 。
即使这种情况在 10000 次转账中只发生一次,这也是一个问题。我需要一种可靠的方法,即使 CPU 负载达到最大,流也应该没有意外的字符,并且不应该被损坏。
什么可能导致这种情况? 实施这个的正确方法是什么?
好的,我找到了。 Node 文档给出了提示。
readable.setEncoding(encoding)
必须用来代替
incoming_buffer += data.toString();
Readable.setEncoding() 方法设置数据的字符编码 从可读流中读取。
默认不指定编码,返回流数据 作为 Buffer 对象。设置编码会导致流数据 作为指定编码的字符串而不是作为 Buffer 返回 对象。例如,调用 Readable.setEncoding('utf8') 将导致 输出数据被解释为 UTF-8 数据,并传递为 字符串。调用 Readable.setEncoding('hex') 会导致数据被 以十六进制字符串格式编码。
可读流将正确处理多字节字符 通过流传递,否则会变得不正确 如果只是从流中作为 Buffer 对象提取,则进行解码。
因此,它更依赖于压力测试中的多字节字符数,而不是 CPU 负载。