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 相关文章推荐
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
Jul 18 Javascript
让innerText在firefox火狐和IE浏览器都能用的写法
May 14 Javascript
jQuery选择器源码解读(七):elementMatcher函数
Mar 31 Javascript
$.extend 的一个小问题
Jun 18 Javascript
深入剖析javascript中的exec与match方法
May 18 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
Jul 14 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
Jul 22 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
JavaScript中闭包的详解
Apr 01 Javascript
vuejs使用FormData实现ajax上传图片文件
Aug 08 Javascript
vue递归获取父元素的元素实例
Aug 07 Javascript
JS实现扫雷项目总结
May 19 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
数据库相关问题
2006/10/09 PHP
PHP计算2点经纬度之间的距离代码
2013/08/12 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
PHP 中常量的知识整理
2017/04/14 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
2014/07/18 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python关闭占用端口方式
2019/12/17 Python
Python 实现简单的客户端认证
2020/07/29 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
遥感技术与仪器求职信
2014/02/22 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
高中美术教学反思
2016/02/17 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS