程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js进程和python进程之间如何通信大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决node.js进程和python进程之间如何通信?

开发过程中遇到node.js进程和python进程之间如何通信的问题如何解决?下面主要结合日常开发的经验,给出你关于node.js进程和python进程之间如何通信的解决方法建议,希望对你解决node.js进程和python进程之间如何通信有所启发或帮助;

我有一个 node.Js 进程和一个并行运行的 python 进程。 Node.Js 进程是一个 http 服务器。每当我收到请求时,我都想在 python 进程中调用一个可调用对象(函数/或任何可调用对象),并从 node.Js 代码中传递一些环境变量和一个可调用函数。在伪代码中,它类似于

// node.Js process
http.createServer(function (req,res) {
  function start_response(status_code,headers){
    // closure function that sets headers
    res.writehead(status_code);
  }
  env = {
 'SERVER_PROTOCol': 'http/1.1','http_HOST': '127.0.0.1:8000','http_CONNECTION': 'keep-alive',}
  // want to call the app function in the python file likr
  // response = app(env,start_responsE)
  // and finally
  res.write(responsE)
  res.end()
})
# python process
def app(env,start_responsE):
    # do something
    start_response(200)
    return "Hello"

这两个进程之间的通信方式是什么。我可以使用 childprocess 从 node.Js 生成一个 python 进程,但是如何将 JavaScript 函数传递给 python?如何解决这个问题?提前致谢。

解决方法

您可以使用 Named Pipes。目标是使用命名管道进行通信。

  1. Node.js 进程将一些数据写入管道 (A)
  2. Python 进程从管道 (A) 读取数据并操作数据
  3. 上面的python进程然后将数据写入管道(B)
  4. Node.js 从管道 (B) 读取

Python:读取、处理和写入

首先,让我们创建一个简单的 Python 进程,它从命名管道 A 读取数据,处理数据,然后将其写入命名管道 B(为简单起见,这里的 process_msg() 函数返回读取的数据)。该脚本首先使用 os.mkfifo() 命令创建命名管道 A。

import os
import SELEct

IPC_FIFO_NAME_A = "pipe_a"
IPC_FIFO_NAME_B = "pipe_b"

def get_message(fifo):
    '''Read n bytes from pipe. Note: n=24 is an example'''
    return os.read(fifo,24)

def process_msg(msg):
    '''Process message read from pipe'''
    return msg

if __name__ == "__main__":
    os.mkfifo(IPC_FIFO_NAME_A)  # Create Pipe A

    try:
        fifo_a = os.open(IPC_FIFO_NAME_A,os.O_RDONLY | os.O_NONBLOCK)  # pipe is opened as read only and in a non-blocking mode
        print('Pipe A ready')

        while True:
            try:
                fifo_b = os.open(IPC_FIFO_NAME_B,os.O_WRONLY)
                print("Pipe B ready")
                break
            except:
                # Wait until Pipe B has been initialized
                pass

        try:
            poll = SELEct.poll()
            poll.register(fifo_a,SELEct.POLLIN)

            try:
                while True:
                    if (fifo_a,SELEct.POLLIN) in poll.poll(1000):  # Poll every 1 sec
                        msg = get_message(fifo_a)                   # Read from Pipe A
                        msg = process_msg(msg)                      # Process message
                        os.write(fifo_b,msg)                       # Write to Pipe B

                        print('----- Received from JS -----')
                        print("    " + msg.decode("utf-8"))
            finally:
                poll.unregister(fifo_a)
        finally:
            os.close(fifo_a)
    finally:
        os.remove(IPC_FIFO_NAME_A)
        os.remove(IPC_FIFO_NAME_B)

Node.js:写入和读取:

接下来,让我们编写一个简单的 Node.js 程序来写入管道。有几个包可以做到这一点:named-pipe、fifo-js。但是,node 提供了一些功能,可以方便地使用管道设置 IPC。下面的脚本每 1 秒将数据写入管道 A(发送数据),并从管道 B 读取(从 Python 接收处理过的数据)。为简单起见,这里的数据是字符串形式的当前时间。

const fs              = require('fs');
const { spawn,fork } = require('child_process');

const path_a = 'pipe_a';
const path_b = 'pipe_b';
let fifo_b   = spawn('mkfifo',[path_b]);  // Create Pipe B

fifo_b.on('exit',function(status) {
    console.log('Created Pipe B');

    const fd   = fs.openSync(path_b,'r+');
    let fifoRs = fs.createReadStream(null,{ fd });
    let fifoWs = fs.createWriteStream(path_a);

    console.log('ready to write')

    seTinterval(() => {
        console.log('-----   Send packet   -----');
        fifoWs.write(`${new Date().toISOString()}`);
    },1000);  // Write data at 1 second interval

    fifoRs.on('data',data => {

        now_time  = new Date();
        sent_time = new Date(data.toString());
        latency   = (now_time - sent_timE);

        console.log('----- Received packet -----');
        console.log('    Date   : ' + data.toString());
        console.log('    Latency: ' + latency.toString() + ' ms');
    });
});

注意:此内容来自here,您可以查看更多详细信息。

大佬总结

以上是大佬教程为你收集整理的node.js进程和python进程之间如何通信全部内容,希望文章能够帮你解决node.js进程和python进程之间如何通信所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。