python - 在 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)
解决方案
你可以把你的python程序变成一个服务器。您的 nodejs 程序可以在启动时启动一次。然后,您不必每次都生成,而是向它发送一个带有 JSON 数据的请求并等待它的响应。
为简单起见,您甚至可以让 python 程序成为一个 http 服务器(在一个已知的、本地的、非公共路由端口上),并且只要您希望它运行对短语的自然语言解析,就可以向它发送一个 http 请求。
将 python 程序想象成一个正在运行并可随时处理请求的服务。这样,您只需支付一次启动成本。
推荐阅读
- java - 如何使用 Spring Kafka 清除测试中的主题
- pyspark - 使用带有条件的 PySpark 窗口函数来添加行
- c++ - cin 是逻辑 1 还是 0?
- python - PyQt QToolButton在焦点时不更新图标
- swift - 在 SwiftUI 中,如何在本地 @State 变量和 @Binding 变量之间共享值?
- python-3.x - 通过龙卷风发布和发布 api 调用
- algorithm - 正式证明 n^n 是 Ω(n!)
- python - 规范化给定列标签的数据框值的子集
- node.js - MongoDb 聚合全文搜索不返回 id 字段
- java - Java 堆空间错误 | 双向链表