0

我有一个 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()函数中的“沸腾”处理有时可能需要一段时间。sleep(2)为了夸大这种效果,我使用了npm sleep 包并将fetch().

果然,在fetch()处理数据时,我不再看到属于receive(). 当处理结束时,两个数据包几乎同时进来并被处理。在阅读了 Node 是单线程的之后,我明白了为什么会这样。当我的代码行按顺序执行时,Node 无法在串行端口上接收数据。时机不好,但他们最终在服务器上的事实是一个好兆头。然而,当我将睡眠时间从 2 秒增加到 10 秒时,行为是相同的。该过程挂起,我在 10 秒内没有记录数据包,10 秒后我几乎同时收到两个数据包(不是十个?)。所以也许 node-serialport 的实现有一个内部缓冲区,只能容纳我的两个数据包?我不知道,但我很好奇。它是这个问题的一个子主题,fetch()将不胜感激

这是我的主要问题:有没有办法/包将处理拆分成块,由于 Node 的单线程特性,这些块本身阻塞,但在块之间留出空间接收串行端口上的数据?或者这两个独立的任务是否需要从父进程产生的两个独立的节点进程?

4

0 回答 0