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读取cookie函数代码
Oct 16 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
Nov 17 Javascript
使用jquery修改表单的提交地址基本思路
Jun 04 Javascript
全系IE支持Bootstrap的解决方法
Oct 19 Javascript
jquery实现九宫格大转盘抽奖
Nov 13 Javascript
JSONObject使用方法详解
Dec 17 Javascript
javascript每日必学之多态
Feb 23 Javascript
laydate.js日期时间选择插件
Jan 04 Javascript
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
面包屑导航详解
Dec 07 Javascript
layui之select的option叠加问题的解决方法
Mar 08 Javascript
Javascript摸拟自由落体与上抛运动原理与实现方法详解
Apr 08 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php 中英文语言转换类代码
2011/08/11 PHP
重新认识php array_merge函数
2014/08/31 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
php微信开发之图片回复功能
2018/06/14 PHP
JavaScript 乱码问题
2009/08/06 Javascript
Extjs中常用表单介绍与应用
2010/06/07 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
jquery判断单选按钮radio是否选中的方法
2015/05/05 Javascript
详谈javascript中的cookie
2015/06/03 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
2017/06/08 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
基于postman获取动态数据过程详解
2020/09/08 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
老生常谈Python进阶之装饰器
2017/05/11 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Kneipp克奈圃美国官网:德国百年精油配方的传承
2018/02/07 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
2016年度继续教育学习心得体会
2016/01/19 职场文书
干货:如何写好工作总结报告!
2019/05/10 职场文书
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android