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 相关文章推荐
datePicker——日期选择控件(with jquery)
Feb 20 Javascript
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 Javascript
JS实现随机颜色的3种方法与颜色格式的转化
Jan 05 Javascript
JS实现的tab切换选项卡效果示例
Feb 28 Javascript
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
Nov 22 Javascript
使用Node.js写一个代码生成器的方法步骤
May 10 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 Javascript
webpack中的模式(mode)使用详解
Feb 20 Javascript
一起来了解一下JavaScript的预编译(小结)
Mar 01 Javascript
vue+elementUI实现表格列的显示与隐藏
Apr 13 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生成月历代码
2007/06/14 PHP
php生成圆角图片的方法
2015/04/07 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
php实现购物车产品删除功能(2)
2020/07/23 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
vue.js开发环境搭建教程
2017/05/04 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
linux服务器快速卸载安装node环境(简单上手)
2021/02/22 Javascript
[39:07]LGD vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python 错误和异常代码详解
2018/01/29 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
Python 使用多属性来进行排序
2019/09/01 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
劳动竞赛活动方案
2014/02/20 职场文书
教师节宣传方案
2014/05/23 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
中小学生学籍证明
2014/10/25 职场文书
2014年政教处工作总结
2014/12/20 职场文书