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 19 Javascript
css样式标签和js语法属性区别
Nov 06 Javascript
js登录弹出层特效
Mar 07 Javascript
javascript实现全角与半角字符的转换
Jan 07 Javascript
JS如何判断json是否为空
Jul 06 Javascript
总结在前端排序中遇到的问题
Jul 19 Javascript
JS简单实现点击复制链接的方法
Aug 03 Javascript
JavaScript实现网页头部进度条刷新
Apr 16 Javascript
Vue结合SignalR实现前后端实时消息同步
Sep 19 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
Dec 13 Javascript
JS回调函数深入理解
Oct 16 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 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
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
2014/04/19 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
浅析php中array_map和array_walk的使用对比
2016/11/20 PHP
理解JSON:3分钟课程
2011/10/28 Javascript
jQuery学习笔记之总体架构
2014/06/03 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
SVG描边动画
2017/02/23 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
Python脚本实现网卡流量监控
2015/02/14 Python
Python实现截屏的函数
2015/07/26 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
微信小程序python用户认证的实现
2019/07/29 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
python库matplotlib绘制坐标图
2019/10/18 Python
python 协程中的迭代器,生成器原理及应用实例详解
2019/10/28 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
计算机专业毕业生自荐信范文
2014/03/06 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
争先创优活动总结
2014/08/27 职场文书
幼儿学前班评语
2014/12/29 职场文书
毕业设计致谢语
2015/05/14 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python