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 变量基础知识
Nov 07 Javascript
js中 关于undefined和null的区别介绍
Apr 16 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
js实现弹窗居中的简单实例
Oct 09 Javascript
JS实现课堂随机点名和顺序点名
Mar 09 Javascript
JS实现动态添加DOM节点和事件的方法示例
Apr 28 Javascript
基于js中style.width与offsetWidth的区别(详解)
Nov 12 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
ElementUI radio组件选中小改造
Aug 12 Javascript
jQuery操作元素追加内容示例
Jan 10 jQuery
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 Javascript
js实现QQ邮箱邮件拖拽删除功能
Aug 27 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的可变变量名的使用方法分享
2012/02/05 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
Smarty模板语法详解
2019/07/20 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
node内置调试方法总结
2018/02/22 Javascript
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Python数组定义方法
2016/04/13 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
python解析基于xml格式的日志文件
2017/02/25 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
校园广播稿500字
2014/02/04 职场文书
大专护理专业自荐信
2015/03/25 职场文书
欢迎新生标语2015
2015/07/16 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android