我有一个Web应用,前端使用JavaScript,后端使用Python。用户输入一个短语,点击按钮后,Python会解析该句子(自然语言处理),然后将数据发送回客户端。我使用SpaCy进行自然语言处理。SpaCy加载时间很长,所以我想知道是否可以在启动服务器时在Node.js中预加载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文件 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 ############# 这一步耗时非常长 ############# nlp = spacy.load("en_core_web_sm") doc = nlp(tc)verb = [token.lemma_ for token in doc if token.pos_ == "VERB"]print(verb)
回答:
你可以将你的Python程序变成一个服务器。你的Node.js程序在启动时可以启动它一次。然后,你不必每次都启动它,只需发送一个带有JSON数据的请求,并等待它的响应即可。
为了简化,你甚至可以让Python程序成为一个HTTP服务器(使用一个已知、本地、非公开路由的端口),这样你就可以在需要对短语进行自然语言解析时向它发送HTTP请求。
把Python程序更多地看作是一个运行中的服务,随时可以处理请求。这样,你只需支付一次启动成本。