首页 > 解决方案 > 我怎样才能异步使用这个 Python-Node.js 串扰库,而方法不会触发每个请求的重复次数?

问题描述

我是一名 Node.js 开发人员,但需要使用 Python 库来执行服务器任务,而我发现这样做最简单的方法是 Python 和 Node 之间使用这个相当晦涩的库 Pytalk 进行双向通信:https://www。 npmjs.com/package/pytalk

文档非常简单,但我遇到了一个问题,如果 Node 连续多次调用相同的 Python 方法Worker.method(methodName),大概在 Python 方法完成执行之前,它会返回对每个调用的响应,次数会增加。我能够通过使用来解决这个问题Worker.methodSync(methodName)。但是现在调用是同步的,因此太慢了。

这是我最初在 Node 中包装 pytalk 用法的方式,也许我的包装器逻辑不好:

const eventList = ['eventName1']

通过使用事件列表并在我的 Python、Node 和 Socket.io 客户端代码之间相应地命名函数,我不必做太多工作来单独声明每个侦听器。

class PyWorker {
    constructor(worker, eventList) {
        this.worker = worker
        eventList.forEach(eventName => {
            this[eventName] = function (data, cb) {
                this.worker.method(eventName)(data, cb)
            }
        })
    }
}

为了解决对事件的单个调用导致重复事件数量增加的问题(几乎就像每次调用都会导致比上一次调用更多的重复一样),我将其修改为:

class PyWorker {
    constructor(worker, eventList) {
        this.worker = worker
        eventList.forEach(eventName => {
            this[eventName] = function (data, cb) {
                let result = this.worker.methodSync(eventName)(data)
                cb(undefined, result) 
                // note: passed undefined where the handler cb originally received an
                // error argument from the above implementation
            }
        })
    }
}

然后:

const app = require('express')()
const http = require('http').createServer(app)
const io = require('socket.io')(http)
const worker = new PyWorker(pytalk.worker('api.py', {
    pythonPath: 'python3'
}), eventList)
io.on('connect', (socket) => {
    eventList.forEach(eventName => {
        socket.on(eventName, data => {
            worker[eventName](data, (err, result) => {
                socket.emit(eventName + '-res', result)
            })
        })
    })
})
http.listen(80)

还有一个例子api.py

@pytalk_method('eventName1')
def eventName1(data)"
    api = my_api_lib.Magic()
    magic_results = api.do_magic()
    return magic_results

由于该库相对未知/很少使用,因此没有太多信息或正确使用它的示例(文档仅提供一个示例)。我尝试了多种解决方案,例如简单地执行 python 文件、读取 STD、各种库,这是看似复杂性最少且使用最简单的解决方案,所以我希望这不是库的基本问题,而是我的一些失败用法。

我怎样才能异步使用这个库,而方法不会触发每个请求的重复次数?

标签: pythonnode.js

解决方案


推荐阅读