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 相关文章推荐
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
Dec 02 Javascript
node.js中的fs.openSync方法使用说明
Dec 17 Javascript
Jquery实现仿京东商城省市联动菜单
Nov 19 Javascript
基于jquery animate操作css样式属性小结
Nov 27 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
JavaScript交换两个变量值的七种解决方案
Dec 01 Javascript
jquery+html仿翻页相册功能
Dec 20 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
深入理解JavaScript创建对象的多种方式以及优缺点
Jun 01 Javascript
JS非空验证及邮箱验证的实例
Aug 11 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 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
多数据表共用一个页的新闻发布
2006/10/09 PHP
php在字符串中查找另一个字符串
2008/11/19 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
js类型检查实现代码
2010/10/29 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
javascript的函数作用域
2014/11/12 Javascript
js实现DOM走马灯特效的方法
2015/01/21 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
2018/01/15 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
利用python画一颗心的方法示例
2017/01/31 Python
Python判断中文字符串是否相等的实例
2018/07/06 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
PyQt5 多窗口连接实例
2019/06/19 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
2020/11/09 Python
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
UNIX文件系统常用命令
2012/05/25 面试题
五好党支部事迹材料
2014/02/06 职场文书
保护环境倡议书300字
2014/05/19 职场文书
干部对照检查材料范文
2014/08/26 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python