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 相关文章推荐
jQuery 处理表单元素的代码
Feb 15 Javascript
js中判断对象是否为空的三种实现方法
Dec 23 Javascript
jQuery formValidator表单验证
Jan 07 Javascript
理解javascript异步编程
Jan 27 Javascript
AngularJs中route的使用方法和配置
Feb 04 Javascript
AngularJS中$http服务常用的应用及参数
Aug 22 Javascript
jQuery事件绑定方法学习总结(推荐)
Nov 21 Javascript
js数组与字符串常用方法总结
Jan 13 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
Mar 10 Javascript
详解vue-cli项目中怎么使用mock数据
May 29 Javascript
Vue数据双向绑定底层实现原理
Nov 22 Javascript
JavaScript canvas实现雨滴特效
Jan 10 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
探讨file_get_contents与curl效率及稳定性的分析
2013/06/06 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
2013/04/16 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
仿ElementUI实现一个Form表单的实现代码
2019/04/23 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
Python中正则表达式的用法实例汇总
2014/08/18 Python
Python实现简单登录验证
2016/04/13 Python
win与linux系统中python requests 安装
2016/12/04 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
解决python中 f.write写入中文出错的问题
2018/10/31 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
医学专业毕业生推荐信
2013/11/14 职场文书
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
保护环境的标语
2014/06/09 职场文书
市场营销专业求职信
2014/06/17 职场文书
房屋出租委托书格式
2014/09/23 职场文书
同学聚会通知书
2015/04/20 职场文书
公司搬迁通知
2015/04/20 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS