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停止输出代码
Jul 20 Javascript
jQuery动态添加的元素绑定事件处理函数代码
Aug 02 Javascript
图片img的src不变让浏览器重新加载实现方法
Mar 29 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
jQuery中before()方法用法实例
Dec 25 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
js闭包引起的事件注册问题介绍
Mar 29 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
Aug 19 Javascript
JavaScript-html标题滚动效果的简单实现
Sep 08 Javascript
详解vue前后台数据交互vue-resource文档
Jul 19 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
Jun 21 Javascript
JS中==、===你分清楚了吗
Mar 04 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使用Mysql事务实例解析
2014/09/08 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
微信小程序scroll-x失效的完美解决方法
2018/07/18 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
JS实现纵向轮播图(初级版)
2020/01/18 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
django最快程序开发流程详解
2019/07/19 Python
详解Python并发编程之从性能角度来初探并发编程
2019/08/23 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python迭代器常见用法实例分析
2019/11/22 Python
pytorch构建多模型实例
2020/01/15 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
团委竞选演讲稿
2014/04/24 职场文书
大学生演讲稿
2014/04/25 职场文书
特岗教师个人总结
2015/02/10 职场文书
小兵张嘎观后感
2015/06/03 职场文书