返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Node.js中怎么实现线程睡眠
  • 454
分享到

Node.js中怎么实现线程睡眠

2024-04-02 19:04:59 454人浏览 独家记忆
摘要

node.js中怎么实现线程睡眠,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一:糟糕的 “循环空转”下面这段代码是糟糕的,node.js

node.js中怎么实现线程睡眠,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一:糟糕的 “循环空转”

下面这段代码是糟糕的,node.js 是以单进程、单线程的方式启动,所有的业务代码都工作在主线程,这样会造成 CPU  持续占用,主线程阻塞对 CPU 资源也是一种浪费,与真正的线程睡眠相差甚远。

const start = new Date(); while (new Date() - start < 2000) {}

Node.js中怎么实现线程睡眠

运行之后如上图所示,CPU 暴涨,同时也会破坏事件循环调度,导致其它任务无法执行。

二:定时器 + Promise 实现 sleep

通过定时器延迟执行函数 setTimeout + Promise 的链式依赖实现,本质是创建一个新的  Promise 对象,待定时器延迟时间到了执行 resolve 函数这时 then 才会执行,这里 Node.js 执行线程是没有进行睡眠的,事件循环和 V8  等都是正常运行的。但这也是目前通用的一种解决方案,因为你不能让主线程阻塞,否则程序就无法继续工作了。

const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));

在 Node.js 中还可以利用 util 模块提供的 promisify 方法实现,一种快捷方式。

const { promisify } = require('util'); const sleep = promisify(setTimeout);

因为是基于定时器与 Promise 所以也自然是异步的方式了,使用时也要注意,如下所示:

// async await 的方式 async function test() {   console.log(1);   await sleep(3000);   console.log(2); }  // Promise 的链式调用方式 async function test() {   console.log(1);   sleep(3000).then(() => {     console.log(2);   }); }

三:零 CPU 开销真正的事件循环阻止 sleep 实现

ECMA262 草案提供了 Atomics.wait api  来实现线程睡眠,它会真正的阻塞事件循环,阻塞线程直到超时。

该方法 Atomics.wait(Int32Array, index, value[, timeout]) 会验证给定的 Int32Array  数组位置中是否仍包含其值,在休眠状态下会等待唤醒或直到超时,返回一个字符串表示超时还是被唤醒。

同样的因为我们的业务是工作在主线程,避免在主线程中使用,在 Node.js 的工作线程中可以根据实际需要使用。

 function sleep(ms) {   const valid = ms > 0 && ms < Infinity;   if (valid === false) {     if (typeof ms !== 'number' && typeof ms !== 'bigint') {       throw TypeError('ms must be a number');     }     throw RangeError('ms must be a number that is greater than 0 but less than Infinity');   }    return Atomics.wait(int32, 0, 0, Number(ms)) }  sleep(3000)

由于本节我们仅是在讲解 sleep 的实现,所以关于 Atomics.wait 方法睡眠之后如何被其它线程唤醒也不再此处讲了,之后我会写一讲  Node.js 中的工作线程相关文章,到时会再次介绍。

四:基于 N-API 扩展使用 C 语言实现 sleep

通过 Addon 的方式使用 N-API 编写 C/C++ 插件,借助其提供的系统 sleep()  函数实现。

// sleep.c #include <assert.h> #include <unistd.h> #include <node_api.h>  napi_value sleepFn(napi_env env, napi_callback_info info) {   napi_status status;   size_t arGC = 1;   napi_value argv[1];    status = napi_get_cb_info(env, info, &argc, argv, NULL, NULL);   assert(status == napi_ok);   if (argc < 1) {     napi_throw_type_error(env, NULL, "ms is required");     return NULL;   }    napi_valuetype valueType;   napi_typeof(env, argv[0], &valueType);   if (valueType != napi_number) {     napi_throw_type_error(env, NULL, "ms must be a number");     return NULL;   }    int64_t s;   napi_get_value_int64(env, argv[0], &s);   sleep(s);   return NULL; }  napi_value init(napi_env env, napi_value exports) {   napi_status status;   napi_property_descriptor descriptor = {     "sleep",     0,     sleepFn,     0,     0,     0,     napi_default,     0   };   status = napi_define_properties(env, exports, 1, &descriptor);   assert(status == napi_ok);   return exports; }  NAPI_MODULE(sleep, init);

经过一系列编译之后,引入 .node 文件直接使用。

// app.js const { sleep } = require('./build/Release/sleep.node'); sleep(3);

五:easy-sleep 模块

这是笔者写的一个小模块  https://GitHub.com/qufei1993/easy-sleep,其实也是对以上几种方法的整合,包含了 C 插件的编写,使用如下:

// Install npm install easy-sleep -S  // Async sleep const { sleep } = require('easy-sleep'); await sleep(3000);  // Thread sleep const { Thread } = require('easy-sleep'); Thread.sleep();

关于Node.js中怎么实现线程睡眠问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网JavaScript频道了解更多相关知识。

--结束END--

本文标题: Node.js中怎么实现线程睡眠

本文链接: https://lsjlt.com/news/74146.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js中怎么实现线程睡眠
    Node.js中怎么实现线程睡眠,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一:糟糕的 “循环空转”下面这段代码是糟糕的,Node.js...
    99+
    2024-04-02
  • java睡眠排序算法怎么实现
    本篇内容主要讲解“java睡眠排序算法怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java睡眠排序算法怎么实现”吧!先看下图:真是厉害啊,这排序, 既有多线程,又有排序,还有lambd...
    99+
    2023-06-29
  • Node.js中怎么实现多线程
    Node.js中怎么实现多线程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Node.js 是如何工作的Node.js 使用两种线程:ev...
    99+
    2024-04-02
  • Linux中进程怎么设置睡眠和唤醒
    这期内容当中小编将会给大家带来有关Linux中进程怎么设置睡眠和唤醒,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Linux 中的进程睡眠状态分类一种是可中断的睡眠状态,其状态标志位TASK_INTERR...
    99+
    2023-06-16
  • Node.js + worker_threads怎么实现多线程
    这篇文章主要介绍“Node.js + worker_threads怎么实现多线程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js + worker_th...
    99+
    2024-04-02
  • Node.js 中怎么实现多线程和多进程
    这期内容当中小编将会给大家带来有关Node.js 中怎么实现多线程和多进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为什么要用 NodeJSJavaScript 最初...
    99+
    2024-04-02
  • 计算机从睡眠或休眠状态中恢复时出现0x0000000a怎么解决
    当计算机从睡眠或休眠状态中恢复时出现0x0000000a错误代码,通常表示出现了一个系统内核错误。该错误代码通常与驱动程序...
    99+
    2023-09-12
    计算机
  • Java项目中怎么让线程休眠
    本篇文章为大家展示了Java项目中怎么让线程休眠,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。sleep()介绍sleep() 定义在Thread.java中。sleep() 的作用是让当前线程休眠...
    99+
    2023-05-31
    java 线程 ava
  • Node.js 中怎么实现多进程
    Node.js 中怎么实现多进程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Node.js 多进程Node.js本身是以单线程的模式运行的,...
    99+
    2024-04-02
  • win8.1系统中无法睡怎么办 睡眠无法唤醒需重启的解决方法
      从win8升级到win8.1系统之后,很多用户会发现新系统还是存在一些问题的,虽然在win8.1系统中也有睡眠功能,但是却无法睡眠,即使是睡眠了也无法唤醒得重新启动,这让win8.1新系统情何以堪啊。现...
    99+
    2022-06-04
    重启 解决方法 睡眠
  • Java中怎么实现线程编程
    Java中怎么实现线程编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、继承Threadpublic class T4 {public&n...
    99+
    2023-06-20
  • Python中怎么实现线程编程
    Python中怎么实现线程编程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、调用thread模块中的start_new_thread()函数来产生新的线程,请看代码:p...
    99+
    2023-06-17
  • Nodejs中怎么实现多线程
    Nodejs中怎么实现多线程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 背景需求中有以下场景1 对称解密、非对称解密2 压缩、解压3...
    99+
    2024-04-02
  • VB.NET中怎么实现多线程
    本篇文章为大家展示了VB.NET中怎么实现多线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。VB.NET(Visual Basic.NET)是为适应Microsoft .NET框架的需要,对Vis...
    99+
    2023-06-17
  • Java中多线程怎么实现
    这篇文章主要讲解了“Java中多线程怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中多线程怎么实现”吧!线程是一些可以并行的,独立的执行的代码.之前我编的程序都只能做一件事情...
    99+
    2023-06-03
  • HTML5中怎么实现多线程
    这篇文章将为大家详细讲解有关HTML5中怎么实现多线程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、明确 JavaScript 是单线程JavaScript 语言的一大特点就是单线程,也...
    99+
    2023-06-09
  • 在win8系统中怎么设置睡眠唤醒需要输入密码
      我的系统是wind   1.点击超级按钮的“设置”选项,如下图:   2.点击“设置”选项中下方的“更改电脑设置”,如下图:   3.在&l...
    99+
    2023-06-04
    win8 睡眠 唤醒 系统 密码
  • Java中怎么实现线程安全
    Java中怎么实现线程安全,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、使用synchronized关键字synchronized关键字可以修饰方法和代码块,它的语义是...
    99+
    2023-06-16
  • C#中怎么实现同步线程
    C#中怎么实现同步线程,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#同步线程在C#同步线程方面,C#提供了几种方法。在上述计算平方的例子中,需要与执行计算的C#同步线程,以...
    99+
    2023-06-17
  • Java中怎么实现线程封闭
    Java中怎么实现线程封闭,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是线程封闭当访问共享变量时,往往需要加锁来保证数据同步。一种避免使用同步的方式就是不共享数据。如...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作