node thread.sleep实现示例


Posted in Javascript onJune 20, 2018

最近在写一些奇怪的东西的时候,发现大佬们用go或者其他语言实现的并发任务用了thread.sleep让主进程暂停。

回头一想,妈个鸡我要复制粘贴到node一直循环不合适啊,我也需要暂停来着!

怎么办??

抓了脑袋一会去npm上找了下相关的包,发现有个叫thread-sleep的包,下载量还挺高。

抱着好奇心去看了下源码,又发现源码相当之骚气

'use strict';

var childProcess = require('child_process');
var nodeBin = process.argv[0];

module.exports = sleep;
function sleep(milliseconds) {
 var start = Date.now();
 if (milliseconds !== Math.floor(milliseconds)) {
  throw new TypeError('sleep only accepts an integer number of milliseconds');
 } else if (milliseconds < 0) {
  throw new RangeError('sleep only accepts a positive number of milliseconds');
 } else if (milliseconds !== (milliseconds | 0)) {
  throw new RangeError('sleep duration out of range')
 }
 milliseconds = milliseconds | 0;

 var shouldEnd = start + milliseconds;
 try {
  childProcess.execFileSync(nodeBin, [ '-e',
   'setTimeout(function() {}, ' + shouldEnd + ' - Date.now());'
  ], {
   timeout: milliseconds,
  });
 } catch (ex) {
  if (ex.code !== 'ETIMEDOUT') {
   throw ex;
  }
 }
 var end = Date.now();
 return end - start;
}

黑人问号???

这是什么奇怪的实现。

翻阅node文档发现

Synchronous Process Creation#

The child_process.spawnSync(),
child_process.execSync(), and child_process.execFileSync() methods are synchronous and WILL block the Node.js event loop,
pausing execution of any additional code until the spawned process exits.

Blocking calls like these are mostly useful for simplifying general-purpose scripting tasks and for simplifying the loading/processing of application configuration at startup.
???

以上三种同步方法会阻塞nodejs的事件循环,除非创建的子进程执行完了,才会继续执行下面的代码。

thread-sleep包的作者正是利用这一特性实现了sleep功能。叹为观止

node thread.sleep实现示例

所以很多时候我们没办法解决现有问题的原因是对文档不熟么??

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中this的使用详解
Nov 08 Javascript
JavaScript 基本概念
Jan 20 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
Bootstrap CSS布局之表格
Dec 17 Javascript
fullPage.js和CSS3实现全屏滚动效果
May 05 Javascript
详解React Native顶|底部导航使用小技巧
Sep 14 Javascript
vue监听input标签的value值方法
Aug 27 Javascript
Echart折线图手柄触发事件示例详解
Dec 16 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
Html5生成验证码的示例代码
May 10 Javascript
js中Map和Set的用法及区别实例详解
Feb 15 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
解决循环中setTimeout执行顺序的问题
Jun 20 #Javascript
Vue.use源码学习小结
Jun 20 #Javascript
Vuex入门到上手教程
Jun 20 #Javascript
JavaScript 中的 this 工作原理
Jun 20 #Javascript
如何用webpack4带你实现一个vue的打包的项目
Jun 20 #Javascript
JavaScript对象拷贝与Object.assign用法实例分析
Jun 20 #Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 #Javascript
You might like
PHP 错误之引号中使用变量
2009/05/04 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
Cookie 注入是怎样产生的
2009/04/08 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
JavaScript中for-in遍历方式示例介绍
2014/02/11 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
50行Python代码实现人脸检测功能
2018/01/23 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
详解python配置虚拟环境
2019/04/08 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python numpy数组中的复制知识解析
2020/02/03 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
工资收入证明样本(5篇)
2014/09/16 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
服务员态度差检讨书
2014/10/28 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
退休教师追悼词
2015/06/23 职场文书
2015年度优秀员工获奖感言
2015/07/31 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
详解apache编译安装httpd-2.4.54及三种风格的init程序特点和区别
2022/07/15 Servers