mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 23:34:47 -05:00
5a91a065b8
This PR implements the Node child_process IPC functionality in Deno on Unix systems. For `fd > 2` a duplex unix pipe is set up between the parent and child processes. Currently implements data passing via the channel in the JSON serialization format.
64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
import { fork } from "node:child_process";
|
|
import process from "node:process";
|
|
import { setImmediate } from "node:timers";
|
|
|
|
if (process.env.CHILD) {
|
|
const len = +process.env.CHILD;
|
|
const msg = ".".repeat(len);
|
|
const send = () => {
|
|
while (process.send(msg));
|
|
// Wait: backlog of unsent messages exceeds threshold
|
|
setImmediate(send);
|
|
};
|
|
send();
|
|
} else {
|
|
function main(dur, len) {
|
|
const p = new Promise((resolve) => {
|
|
const start = performance.now();
|
|
|
|
const options = {
|
|
"stdio": ["inherit", "inherit", "inherit", "ipc"],
|
|
"env": { "CHILD": len.toString() },
|
|
};
|
|
const path = new URL("child_process_ipc.mjs", import.meta.url).pathname;
|
|
const child = fork(
|
|
path,
|
|
options,
|
|
);
|
|
|
|
let bytes = 0;
|
|
let total = 0;
|
|
child.on("message", (msg) => {
|
|
bytes += msg.length;
|
|
total += 1;
|
|
});
|
|
|
|
setTimeout(() => {
|
|
child.kill();
|
|
const end = performance.now();
|
|
const mb = bytes / 1024 / 1024;
|
|
const sec = (end - start) / 1000;
|
|
const mbps = mb / sec;
|
|
console.log(`${len} bytes: ${mbps.toFixed(2)} MB/s`);
|
|
console.log(`${total} messages`);
|
|
resolve();
|
|
}, dur * 1000);
|
|
});
|
|
return p;
|
|
}
|
|
|
|
const len = [
|
|
64,
|
|
256,
|
|
1024,
|
|
4096,
|
|
16384,
|
|
65536,
|
|
65536 << 4,
|
|
65536 << 6 - 1,
|
|
];
|
|
|
|
for (const l of len) {
|
|
await main(5, l);
|
|
}
|
|
}
|