当前位置: 首页 > 面试题库 >

如何在阻塞的nodejs中创建睡眠/延迟?

宋航
2023-03-14
问题内容

我目前正在尝试学习nodejs,而我正在做的一个小项目正在编写一个API,以控制一些联网的LED灯。

控制LED的微处理器具有处理延迟,我需要将发送给微控制器的命令间隔至少100毫秒。在C#中,我习惯于仅调用Thread.Sleep(time),但在node中没有找到类似的功能。

我已经找到了在节点中使用setTimeout(…)函数的几种解决方案,但是,这是异步的并且不会阻塞线程(这是我在此方案中需要的)。

有人知道阻塞睡眠或延迟功能吗?最好是不只是旋转CPU并具有+ -10毫秒的精度?


问题答案:

最好的解决方案是为您的LED创建单例控制器,该控制器将排队所有命令并以指定的延迟执行它们:

function LedController(timeout) {
  this.timeout = timeout || 100;
  this.queue = [];
  this.ready = true;
}

LedController.prototype.send = function(cmd, callback) {
  sendCmdToLed(cmd);
  if (callback) callback();
  // or simply `sendCmdToLed(cmd, callback)` if sendCmdToLed is async
};

LedController.prototype.exec = function() {
  this.queue.push(arguments);
  this.process();
};

LedController.prototype.process = function() {
  if (this.queue.length === 0) return;
  if (!this.ready) return;
  var self = this;
  this.ready = false;
  this.send.apply(this, this.queue.shift());
  setTimeout(function () {
    self.ready = true;
    self.process();
  }, this.timeout);
};

var Led = new LedController();

现在您可以拨打电话Led.exec,它将为您处理所有延迟:

Led.exec(cmd, function() {
  console.log('Command sent');
});


 类似资料:
  • 问题内容: 我正在努力使自己在nodejs中创建非阻塞的繁重计算。请看以下示例(从其他内容中删除): 可以想象,如果我同时打开2个浏览器窗口,第一个将等待10秒,另一个将等待20秒,这与预期的一样。因此,在知道回调以某种方式是异步的情况下,我删除了睡眠并改为放置: 具有简单定义的功能: 那当然是行不通的…我也曾尝试定义一个EventEmitter并向其注册,但是例如,发射器的主要功能在发出“完成”

  • 我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。 我找到了两种方法来完成这件事。 > 在没有睡眠的情况下旋转。 在睡眠中旋转循环。 如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?

  • 问题内容: 我习惯从X开始评估我的。在我中,我使用启动我的窗口管理器。现在,如果我杀死了我的WM(为了测试其他WM),X也将终止,因为脚本到达了EOF。所以我在我的末尾添加了这个: 这样,如果我杀死WM,X不会终止。现在我的问题是:我该如何 无限睡眠 而不是循环睡眠?是否有一个类似于冻结脚本的命令? 最好的祝福 问题答案: 完全按照建议进行操作,并且不会虐待猫。

  • 我的任务是编写一个生产者/消费者程序,其中有多个消费者,每个消费者对应于自己的共享数据结构,而生产者可以访问所有共享数据结构。无论如何,我遇到的问题是用每个使用者线程自己的结构初始化它;这是通过每个线程获得自己的唯一编号来实现的。例如,线程0获得作为参数传入的数字0,线程1获得数字1,等等。但是,我只能通过调用sleep来让每个线程获得其唯一的数字。 remp->rop是每个线程的不同参数,每个线

  • 本文向大家介绍轻松创建nodejs服务器(8):非阻塞是如何实现的,包括了轻松创建nodejs服务器(8):非阻塞是如何实现的的使用技巧和注意事项,需要的朋友参考一下 这节我们来了解一下nodejs实现非阻塞操作的方法。 我们先来修改一下 start的处理程序: 这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将co

  • 问题内容: 基本上,我有一个URL,当发布新消息时,该URL在聊天室中流xml更新。我想将URL转换为InputStream并继续读取它,只要保持连接并且没有发送Thread.interrupt()。我遇到的问题是,当有内容要从流中读取时,BufferedReader.ready()似乎不正确。 我正在使用以下代码: 当我运行代码并将某些内容发布到聊天室时,buf.ready()永远不会变为tru