You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node进程与常驻Python子进程双向通信实现问题咨询

问题核心原因

你当前的Python代码仅实现了向通信通道写入数据的逻辑,没有对通道输入做监听读取,因此无法接收Node侧后续发送的消息。

修复后可直接运行的完整实现

采用标准输入输出做管道通信,兼容性更强、运行更稳定,完全满足你列出的所有要求:

Node侧代码

const cp = require('child_process')

const child = cp.spawn('python', ['main.py'], {
    stdio: ['pipe', 'pipe', 'inherit'],
    // 禁用Python输出缓冲,避免消息延迟
    env: { ...process.env, PYTHONUNBUFFERED: '1' }
})

// 测试定时向Python发送消息
setInterval(() => {
    const sendMsg = JSON.stringify({
        message: `hi from node, timestamp: ${Date.now()}`
    }) + '\n'
    child.stdin.write(sendMsg)
}, 2000)

// 监听Python返回的响应
let receiveBuffer = ''
child.stdout.on('data', (chunk) => {
    receiveBuffer += chunk.toString()
    // 按换行符拆分多条消息
    const messageLines = receiveBuffer.split('\n')
    receiveBuffer = messageLines.pop() // 保留不完整的半条消息到下一次处理
    messageLines.forEach(line => {
        if (!line.trim()) return
        try {
            const parsedMsg = JSON.parse(line)
            console.log('Node收到Python回复:', parsedMsg)
        } catch (err) {
            // 忽略格式错误的消息
        }
    })
})

// 异常监听
child.on('error', (err) => console.error('子进程运行错误:', err))
child.on('exit', (code) => console.log('子进程退出,状态码:', code))

Python侧代码

import sys
import json
import threading
from time import sleep

# 业务逻辑处理函数,异步执行不阻塞消息接收
def handle_message(receive_msg):
    # 这里替换为你自己的业务处理逻辑,sleep模拟耗时操作
    sleep(2)
    reply_msg = {
        "message": f"处理完成,收到的消息内容为:{receive_msg['message']}"
    }
    # 输出响应到stdout,flush强制立即发送避免缓冲
    print(json.dumps(reply_msg), flush=True)

if __name__ == "__main__":
    # 循环监听stdin输入,子进程长期运行不退出
    for line in sys.stdin:
        line = line.strip()
        if not line:
            continue
        try:
            parsed_msg = json.loads(line)
            # 启动独立线程处理消息,满足异步回复要求
            threading.Thread(
                target=handle_message,
                args=(parsed_msg,),
                daemon=True
            ).start()
        except json.JSONDecodeError:
            # 忽略格式异常的消息
            continue

关键说明

  • 方案采用spawn + 标准管道通信,完全不需要WebSocket,仅在本地进程间通信,性能损耗极低
  • Python子进程长期运行,不需要每次调用都销毁重建
  • 每条消息用独立线程处理,不会因为单条消息耗时阻塞后续消息的接收和响应,完全满足异步回复要求
  • 按行分割JSON消息的设计可以避免粘包问题,长期运行稳定可靠

内容的提问来源于stack exchange,提问作者Ezio Greggio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:27:03