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获取地址栏参数插件(模仿C#)
Oct 26 Javascript
jquery阻止冒泡事件使用模拟事件
Sep 06 Javascript
JavaScript学习笔记之基础语法
Jan 22 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
Javascript单例模式的介绍和实例
Oct 08 Javascript
Angularjs 设置全局变量的方法总结
Oct 20 Javascript
利用angular.copy取消变量的双向绑定与解析
Nov 25 Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 Javascript
Javascript刷新页面的实例
Sep 23 Javascript
小程序实现日历左右滑动效果
Oct 21 Javascript
VUE实现自身整体组件销毁的示例代码
Jan 13 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 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
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
PHP数组实例总结与说明
2011/08/23 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
Zend Guard使用指南及问题处理
2015/01/07 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
js对象的比较
2011/02/26 Javascript
jQuery load方法用法集锦
2011/12/06 Javascript
js Date概念详细介绍
2013/11/22 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
用Python遍历C盘dll文件的方法
2015/05/06 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python提取图像的名字*.jpg到txt文本的方法
2018/05/10 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
学习Django知识点分享
2019/09/11 Python
利用OpenCV和Python实现查找图片差异
2019/12/19 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
2020/06/18 Python
实现Python3数组旋转的3种算法实例
2020/09/16 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
The North Face意大利官网:服装、背包和鞋子
2020/06/17 全球购物
2014年外联部工作总结
2014/11/17 职场文书
2014年科普工作总结
2014/12/06 职场文书
论文答辩开场白大全
2015/05/27 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB