【发布时间】:2018-02-01 13:31:17
【问题描述】:
我正在尝试在 node.js 中实现类似 c 的等待和信号。我想到了二进制信号量或互斥体。请记住,我是 node.js 的新手,对 javascript 不是很熟练。
我的事情是:
我有一个python交互进程在服务器上运行。
客户端向服务器创建一个 Ajax,然后服务器通过在其标准输入上写入来询问这个 python 进程。 http 响应对象保存在一个变量中。
然后我拦截包含我的答案的标准输出,并将其发送到保留的响应对象中。
我想让这个“python 部分”原子化,这意味着:
如果在 python 进程已经运行时收到另一个请求,请等待。否则请求将丢失。
当标准输出触发时,发送信号释放访问。
同样,与 P 和 V 在二进制信号量或互斥锁和互斥解锁中的行为相同。
那么,如果您是高级 nodejs 用户有什么建议吗?我查看了 npm,但除了类似 Promise 的互斥体之外什么也没找到,我认为这并不适合我的情况。
也许我错了,有办法。 无论如何,我期待阅读您的建议或解决方法。 谢谢。
这里是相关的示例代码。
route.js
var express = require('express');
var router = express.Router();
var pycaffe = require('./pycaffe');
var py = pycaffe.getInstance();
router.post('/getParams', function(req, res, next){
in_data = req.body.imgBase64;
py.queryParams(res, in_data);
});
pycaffe.js
const { spawn } = require('child_process');
var pycaffe = (function () {
var pycaffeInstance;
function create () {
var response;
console.log('Loading nets...');
const defaults = {
cwd: './nets',
env: process.env
};
var py = spawn('python', ['-i', 'deploy.py'], defaults);
py.stdout.on('data', function(data){
console.log(`stdout: ${data}`);
var fig = JSON.parse(data);
if(response !== undefined)
//send http response
response.send(fig)
//mutex.unlock()
});
function queryParams(res, data) {
//mutex.lock()
response = res;
py.stdin.write("query_params('"+data+"')\n");
}
return {
queryParams: queryParams
};
}
return {
getInstance: function() {
if(!pycaffeInstance) {
pycaffeInstance = create();
}
return pycaffeInstance;
}
};
})();
module.exports = pycaffe;
【问题讨论】:
-
如何知道python实例何时返回响应?它会写信给
stdout吗? -
是的,它写的内容是在 http 响应中发送的
标签: javascript python c node.js asynchronous