节点非阻塞数据处理

时间:2014-07-10 16:51:08

标签: node.js express node-serialport

我有一个Node进程,它使用node-serialport处理来自微控制器的传入数据包(每秒一次),并使用Express从浏览器处理传入的http请求。数据是从Mongo数据库中存储和访问的。

这是处理来自串口的数据的代码:

// Handles incoming chunks of binary data from the device.
serialport.on('data',function(data) {
    // Store data packet in the database
    receive(data);
});

这是处理来自浏览器的请求的代码:

// Serves data dynamically via AJAX.
app.get('/fetch', function(req,res) { return fetch(req,res); });

receive()fetch()都会登录到控制台。

总而言之,fetch()可获得高达8M的数据库条目,并将它们全部归结为最多1000个数据点乘以7个数据集,然后通过网络发送它们。问题是fetch()函数中的“沸腾”处理有时需要一段时间。为了夸大这种效果,我使用了npm sleep包并将sleep(2)放在fetch()的开头。

果然,当fetch()正在处理数据时,我不再看到receive()中的日志记录。当处理结束时,两个数据包几乎同时进入并被处理。在阅读Node是单线程的之后,我明白为什么会发生这种情况。当我的代码行被顺序执行时,Node无法在串行端口上接收数据。时机不好,但它们最终在服务器上的事实是一个好兆头。然而,当我将睡眠时间从2秒提高到10秒时,行为是相同的。进程挂起,我没有数据包记录10秒,10秒后我几乎同时得到两个数据包(不是10?)。所以也许node-serialport的实现有一个内部缓冲区,只能容纳我的两个数据包?我不知道,但我很好奇。这是一个关于这个问题的子主题,但是无论我fetch()花了多长时间,我都会理解为什么在完成处理后我得到两个数据包的原因

这是我的主要问题:是否存在一种方法/包将处理拆分为由于Node的单线程性质本身阻塞的块,但是在块之间的串口上留下接收数据的空间?或者这两个单独的任务是否需要从父进程生成两个单独的节点进程?

0 个答案:

没有答案