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 相关文章推荐
js当一个变量为函数时 应该注意的一点细节小结
Dec 29 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
Jun 24 Javascript
判断javascript的数据类型(示例代码)
Dec 11 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
Jun 17 Javascript
xmlplus组件设计系列之按钮(2)
Apr 26 Javascript
Angularjs 1.3 中的$parse实例代码
Sep 14 Javascript
基于jquery的on和click的区别详解
Jan 15 jQuery
JavaScript比较同一天的时间大小实例代码
Feb 09 Javascript
js操作二进制数据方法
Mar 03 Javascript
详解可以用在VS Code中的正则表达式小技巧
May 14 Javascript
JavaScript实现简单的弹窗效果
May 19 Javascript
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 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设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
基于jquery实现控制经纬度显示地图与卫星
2013/05/20 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
纯javascript版日历控件
2016/11/24 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
微信小程序利用canvas 绘制幸运大转盘功能
2018/07/06 Javascript
vue初始化动画加载的实例
2018/09/01 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
Python中的作用域规则详解
2015/01/30 Python
Python字符串处理函数简明总结
2015/04/13 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
python里 super类的工作原理详解
2019/06/19 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python实现人机猜拳小游戏
2020/02/03 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
个人工作年终总结
2015/03/09 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android