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 正则替换 replace(regExp, function)用法
May 22 Javascript
jQuery实现级联菜单效果(仿淘宝首页菜单动画)
Apr 10 Javascript
JS中实现简单Formatter函数示例代码
Aug 19 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
May 24 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
Jul 22 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
Angular2学习教程之TemplateRef和ViewContainerRef详解
May 25 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
Vue.js watch监视属性知识点总结
Nov 11 Javascript
详解vue3.0 diff算法的使用(超详细)
Jul 01 Javascript
vue-model实现简易计算器
Aug 17 Javascript
解决循环中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
重置版战役片段
2020/04/09 魔兽争霸
?算你??的 PHP 程式大小
2006/12/06 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
Yii实现的多级联动下拉菜单
2016/07/13 PHP
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
JavaScript制作windows经典扫雷小游戏
2015/03/31 Javascript
JS闭包经典实例详解
2018/12/20 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
python实现二叉树的遍历
2017/12/11 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Python和Go语言的区别总结
2019/02/20 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
Django 用户认证Auth组件的使用
2020/11/30 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
《桂花雨》教学反思
2014/04/12 职场文书
股东合作协议书范本
2014/04/14 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
党校学习心得体会范文
2014/09/09 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
借条如何写
2015/05/26 职场文书
小学毕业感言200字
2015/07/30 职场文书