subprocess.send(message[, sendHandle[, options]][, callback])
版本 | 變化 |
---|---|
v5.8.0 | 現在支持 |
v5.0.0 | 此方法現在返回一個用於流量控製的布爾值。 |
v4.0.0 | 現在支持 |
v0.5.9 | 添加於:v0.5.9 |
參數
message
<Object>sendHandle
<Handle>options
<Object>options
參數(如果存在)是用於參數化某些類型句柄的發送的對象。options
支持以下屬性:keepOpen
<boolean> 傳遞net.Socket
的實例時可以使用的值。當true
時,套接字在發送過程中保持打開狀態。 默認:false
。
callback
<Function>- 返回: <boolean>
當父子進程之間建立了 IPC 通道時(即使用
時),可以使用 child_process.fork()
subprocess.send()
方法向子進程發送消息。當子進程是 Node.js 實例時,可以通過
事件接收這些消息。'message'
消息經過序列化和解析。生成的消息可能與最初發送的消息不同。
例如,在父腳本中:
const cp = require('node:child_process');
const n = cp.fork(`${__dirname}/sub.js`);
n.on('message', (m) => {
console.log('PARENT got message:', m);
});
// Causes the child to print: CHILD got message: { hello: 'world' }
n.send({ hello: 'world' });
然後子腳本 'sub.js'
可能如下所示:
process.on('message', (m) => {
console.log('CHILD got message:', m);
});
// Causes the parent to print: PARENT got message: { foo: 'bar', baz: null }
process.send({ foo: 'bar', baz: NaN });
子 Node.js 進程將擁有自己的
方法,允許子進程將消息發送回父進程。process.send()
發送{cmd: 'NODE_foo'}
消息時有一種特殊情況。 cmd
屬性中包含 NODE_
前綴的消息保留用於 Node.js 核心,不會在子級的
事件中發出。相反,此類消息是使用 'message'
'internalMessage'
事件發出的,並由 Node.js 在內部使用。應用程序應避免使用此類消息或偵聽 'internalMessage'
事件,因為它可能會發生更改,恕不另行通知。
可以傳遞給subprocess.send()
的可選sendHandle
參數用於將TCP 服務器或套接字對象傳遞給子進程。孩子將接收對象作為第二個參數傳遞給在
事件上注冊的回調函數。在套接字中接收和緩衝的任何數據都不會發送給孩子。'message'
可選的callback
是一個函數,它在消息發送之後但在孩子可能收到消息之前被調用。該函數使用單個參數調用:成功時為null
,失敗時為
對象。Error
如果沒有提供callback
函數並且無法發送消息,則
對象將發出ChildProcess
'error'
事件。例如,當子進程已經退出時,就會發生這種情況。
subprocess.send()
將返回 false
如果通道已關閉或未發送消息的積壓超過閾值,導致發送更多消息是不明智的。否則,該方法返回 true
。 callback
函數可用於實現流量控製。
示例:發送服務器對象#
例如,sendHandle
參數可用於將 TCP 服務器對象的句柄傳遞給子進程,如下例所示:
const subprocess = require('node:child_process').fork('subprocess.js');
// Open up the server object and send the handle.
const server = require('node:net').createServer();
server.on('connection', (socket) => {
socket.end('handled by parent');
});
server.listen(1337, () => {
subprocess.send('server', server);
});
然後,孩子將收到服務器對象:
process.on('message', (m, server) => {
if (m === 'server') {
server.on('connection', (socket) => {
socket.end('handled by child');
});
}
});
一旦服務器現在在父母和孩子之間共享,一些連接可以由父母處理,一些由孩子處理。
雖然上麵的示例使用使用 node:net
模塊創建的服務器,但 node:dgram
模塊服務器使用完全相同的工作流程,但偵聽 'message'
事件而不是 'connection'
以及使用 server.bind()
而不是 server.listen()
。但是,目前僅在 Unix 平台上支持。
示例:發送套接字對象#
同樣,sendHandler
參數可用於將套接字句柄傳遞給子進程。下麵的示例生成了兩個子節點,每個子節點處理具有 "normal" 或 "special" 優先級的連接:
const { fork } = require('node:child_process');
const normal = fork('subprocess.js', ['normal']);
const special = fork('subprocess.js', ['special']);
// Open up the server and send sockets to child. Use pauseOnConnect to prevent
// the sockets from being read before they are sent to the child process.
const server = require('node:net').createServer({ pauseOnConnect: true });
server.on('connection', (socket) => {
// If this is special priority...
if (socket.remoteAddress === '74.125.127.100') {
special.send('socket', socket);
return;
}
// This is normal priority.
normal.send('socket', socket);
});
server.listen(1337);
subprocess.js
將接收套接字句柄作為傳遞給事件回調函數的第二個參數:
process.on('message', (m, socket) => {
if (m === 'socket') {
if (socket) {
// Check that the client socket exists.
// It is possible for the socket to be closed between the time it is
// sent and the time it is received in the child process.
socket.end(`Request handled with ${process.argv[2]} priority`);
}
}
});
不要在已傳遞給子進程的套接字上使用.maxConnections
。父級無法跟蹤套接字何時被銷毀。
子進程中的任何'message'
處理程序都應驗證socket
存在,因為在將連接發送給子進程所需的時間期間連接可能已關閉。
相關用法
- Node.js ChildProcess subprocess.stdio用法及代碼示例
- Node.js ChildProcess subprocess.stdout用法及代碼示例
- Node.js ChildProcess subprocess.unref()用法及代碼示例
- Node.js ChildProcess subprocess.pid用法及代碼示例
- Node.js ChildProcess subprocess.kill([signal])用法及代碼示例
- Node.js ChildProcess subprocess.ref()用法及代碼示例
- Node.js substr()用法及代碼示例
- Node.js socket.bind()用法及代碼示例
- Node.js stream.Writable.uncork()用法及代碼示例
- Node.js split()用法及代碼示例
- Node.js stream.Readable.take(limit[, options])用法及代碼示例
- Node.js serverhttp2session.origin()用法及代碼示例
- Node.js stream.Readable.pipe(destination[, options])用法及代碼示例
- Node.js socket.setRecvBufferSize()用法及代碼示例
- Node.js socket.getSendBufferSize()用法及代碼示例
- Node.js stats.ctimeMs屬性用法及代碼示例
- Node.js stream.Readable.setEncoding(encoding)用法及代碼示例
- Node.js stats.isSymbolicLink()用法及代碼示例
- Node.js stats.atimeMs屬性用法及代碼示例
- Node.js sort()用法及代碼示例
- Node.js stream.Readable.some(fn[, options])用法及代碼示例
- Node.js stream.Readable.map(fn[, options])用法及代碼示例
- Node.js socket.setBroadcast()用法及代碼示例
- Node.js socket.ref()用法及代碼示例
- Node.js stats.isFIFO()用法及代碼示例
注:本文由純淨天空篩選整理自nodejs.org大神的英文原創作品 subprocess.send(message[, sendHandle[, options]][, callback])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。