首页 > 解决方案 > 在 Nodejs 中预加载 python 库

问题描述

我有一个带有 JavaScript 前端和 python 后端的网络应用程序。用户写一个短语,点击一个按钮,python 解析句子(自然语言处理)并将数据发送回客户端。我使用 SpaCy 进行自然语言处理。SpaCy 需要很长时间才能加载,所以我想知道当我启动服务器时是否可以在 NodeJS 中预加载 SpaCy(与每次生成 python 文件时导入 SpaCy 相比——这就是我现在所做的,参见下面的代码)。谢谢!

JavaScript 代码:

io.on('connection', (socket) => {
    socket.on('run_command_request', async (data) => {
        let output_str = await run_python_command(data);
        socket.emit('run_command_complete');
    });
});


async function run_python_command(data) {
    var spawn = require('child_process').spawn;
    var py = spawn(python_executable, ['./run_command.py']); //PYTHON FILE CALLED EVERY TIME A USER CLICKS A BUTTON
    var python_output_string ='';
    py.stdin.write(JSON.stringify(data));
    py.stdin.end();
    return new Promise((res, rej) => {
        py.stdout.on('end', function() {
            res(python_output_string);
        });
    });
}

Python代码:

import spacy #############   THIS STEP TAKES FOREVER    #############   
nlp = spacy.load("en_core_web_sm") 
doc = nlp(tc)
verb = [token.lemma_ for token in doc if token.pos_ == "VERB"]
print(verb)

标签: pythonnode.jsmachine-learningnlpspacy

解决方案


你可以把你的python程序变成一个服务器。您的 nodejs 程序可以在启动时启动一次。然后,您不必每次都生成,而是向它发送一个带有 JSON 数据的请求并等待它的响应。

为简单起见,您甚至可以让 python 程序成为一个 http 服务器(在一个已知的、本地的、非公共路由端口上),并且只要您希望它运行对短语的自然语言解析,就可以向它发送一个 http 请求。

将 python 程序想象成一个正在运行并可随时处理请求的服务。这样,您只需支付一次启动成本。


推荐阅读