NodeJs之定时器与队列

一,介绍与需求

1.1,介绍

定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序。它允许您使用可选的递归规则将作业(任意函数)安排在特定日期执行。它在任何给定的时间只使用一个计时器(而不是每秒钟/分钟重新评估即将到来的作业)。

Async是一个实用模块,它为异步JavaScript提供了直接、强大的功能。async流程控制器--queue(队列),queue流程控制器是一个并行的流程控制器,但是它与parallel的区别在于queue可以控制一次执行几个函数,而parallel只是让所有函数并行执行.

1.2,需求

实际开发项目中,会遇到很多定时任务的工作。比如:定时导出某些数据、定时发送消息或邮件给用户、定时备份什么类型的文件等等。在当时给用户发送消息时,可能要发送的用户就不只有一两个,二是多个,这是可能就会用到队列顺序执行。

二,定时器

第一步:安装node-schedule

  1. npm install node-schedule --save

第二步:封装定时器模块

  1. const schedule = require('node-schedule');//定时器
  2. const nodeTimer = {};
  3. let cancelTimer = ''
  4. /**
  5. *Cron风格定时器/对象文本语法定时器
  6. * @param executionTime :定时器字符串'30 * * * * *'/定时器对象{hour: 16, minute: 11, dayOfWeek: 1}
  7. * @param callback :回调函数
  8. */
  9. nodeTimer.scheduleTimer = (executionTime = '30 * * * * *', callback) => {
  10. // 每分钟的第30秒触发: '30 * * * * *'
  11. // 每小时的1分30秒触发 :'30 1 * * * *'
  12. // 每天的凌晨1点1分30秒触发 :'30 1 1 * * *'
  13. // 每月的1日1点1分30秒触发 :'30 1 1 1 * *'
  14. // 2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *'
  15. // 每周1的1点1分30秒触发 :'30 1 1 * * 1'
  16.  
  17. cancelTimer = schedule.scheduleJob(executionTime, () => {
  18. if (typeof callback === 'function') {
  19. callback()
  20. }
  21. });
  22.  
  23. }
  24. module.exports = nodeTimer;

第三步:调用

在回调函数中写入要执行的任务代码,一个定时器就完成了!

引入定时器模块:

  1. const nodeTimer = require('./node_timer.js');

1,Cron风格定时器

规则参数讲解 *代表通配符
  1. * * * * * *


  2. day of week (0 - 7) (0 or 7 is Sun)
  3. └───── month (1 - 12)
  4. └────────── day of month (1 - 31)
  5. └─────────────── hour (0 - 23)
  6. └──────────────────── minute (0 - 59)
  7. └───────────────────────── second (0 - 59, OPTIONAL)

6个占位符从左到右分别代表:秒、分、时、日、月、周几

*表示通配符,匹配任意,当秒是*时,表示任意秒数都触发,其它类推

  1. // 每分钟的第30秒触发: '30 * * * * *'
  2. // 每小时的1分30秒触发 :'30 1 * * * *'
  3. // 每天的凌晨1点1分30秒触发 :'30 1 1 * * *'
  4. // 每月的1日1点1分30秒触发 :'30 1 1 1 * *'
  5. // 2016年的1月1日1点1分30秒触发 :'30 1 1 1 2016 *'
  6. // 每周1的1点1分30秒触发 :'30 1 1 * * 1'
  7. // 每分钟的1-10秒都会触发,其它通配符依次类推 :'1-10 * * * * *'

调用定时器:

  1. nodeTimer.scheduleTimer('30 * * * * *',function(err){
  2. if(!err){
  3. console.log('scheduleTimer:' + new Date());
  4. }
  5. });

效果:

2、对象文本语法定时器

      • second (0-59)
      • minute (0-59)
      • hour (0-23)
      • date (1-31)
      • month (0-11)
      • year
      • dayOfWeek (0-6) Starting with Sunday
  1. //每周一的下午15:03:30触发,其它组合可以根据我代码中的注释参数名自由组合
  2. nodeTimer.scheduleTimer({hour: 15, minute: 3, second: 30},function(err){
  3. if(!err){
  4. console.log('scheduleTimer:' + new Date());
  5. }
  6. });

效果:

3、基于日期的定时器

  1. var date = new Date(2019, 01, 07, 15, 03, 30);
  2. nodeTimer.scheduleTimer(date,function(err){
  3. if(!err){
  4. console.log('scheduleTimer:' + new Date());
  5. }
  6. });

4、递归规则定时器

参数与对象文本语法定时器的参数类似

  1. var rule = new schedule.RecurrenceRule();
  2. rule.dayOfWeek = [0, new schedule.Range(4, 6)];//每周四,周五,周六执行
  3. rule.hour = 15;
  4. rule.minute = 0;
  5. nodeTimer.scheduleTimer(rule,function(err){
  6. if(!err){
  7. console.log('scheduleTimer:' + new Date());
  8. }
  9. });

5、取消定时器

  1. // 取消定时器
  2. // 调用 定时器对象的cancl()方法即可
  3. nodeTimer.scheduleCancel = () => {
  4. // 定时器取消
  5. cancelTimer.cancel();
  6. console.log('定时器成功取消');
  7. }

调用:

  1. nodeTimer.scheduleCancel()

效果:

三,队列

第一步:安装async

  1. npm install --save async

第二步:封装方法

queue相当于一个加强版的parallel,主要是限制了worker数量,不再一次性全部执行。当worker数量不够用时,新加入的任务将会排队等候,直到有新的worker可用。

该函数有多个点可供回调,如worker用完时、无等候任务时、全部执行完时等。

  1. const async = require('async');
  2. /**
  3. *队列
  4. * @param obj :obj对象 包含执行时间
  5. * @param callback :回调函数
  6. */
  7. const nodeQueue = async.queue(function (obj, callback) {
  8. setTimeout(function () {
  9. // 需要执行的代码的回调函数
  10. if(typeof callback==='function'){
  11. callback();
  12. }
  13. }, obj.time)
  14. }, 1)
  15.  
  16. // worker数量将用完时,会调用saturated函数
  17. nodeQueue.saturated = function() {
  18. console.log('all workers to be used');
  19. }
  20.  
  21. // 当最后一个任务交给worker执行时,会调用empty函数
  22. nodeQueue.empty = function() {
  23. console.log('no more tasks wating');
  24. }
  25.  
  26. // 当所有任务都执行完时,会调用drain函数
  27. nodeQueue.drain = function() {
  28. console.log('all tasks have been processed');
  29. }
  30. module.exports = nodeQueue;

第三步:调用方法

  1. const nodeQueue = require('./node_queue.js');
  2. for (let i = 0; i < 10; i++) {
  3. nodeQueue.push({ name: 1, time: 2000 }, function (err) {
  4. console.log('队列执行错误信息==',err);
  5. if(!err){
  6. // 需要执行的代码或函数
  7. console.log('需要执行的代码或函数第',i+1,'个')
  8. }
  9. })
  10. };

效果:

NodeJs之定时器与队列的更多相关文章

  1. 搭建前端监控系统(五)Nodejs怎么搭建消息队列

    怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...

  2. C# 定时器和队列结合,卖包子啦,Timer、 AutoResetEvent、 ManualResetEvent

    再你们得到源码之前,我先做个广告:张家港杰德机械/张家港三兴华轩机械是我一朋友的公司,希望需要做净水,灌装机,拔盖机,封口机,传送带等的朋友光顾. 张家港杰德机械有限公司:http://www.jie ...

  3. 《Python》线程之锁、信号量、事件、条件、定时器、队列

    一.锁 线程为什么要有锁: += .-= 赋值操作数据不安全(要经过取值.计算.放回值,3部操作) pop .append 都是数据安全的(只有添加和删除,一次操作) 队列也是数据安全的 1.同步锁 ...

  4. 7-[多线程]-Event、定时器、队列、堆栈

    1.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测. 如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手. 为了解决这些问题 ...

  5. python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...

  6. 使用NODEJS+REDIS开发一个消息队列以及定时任务处理

    作者:RobanLee 原创文章,转载请注明: 萝卜李 http://www.robanlee.com 源码在这里: https://github.com/robanlee123/RobCron 时间 ...

  7. Javascript定时器学习笔记

    掌握定时器工作原理必知:JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 常言道:setTimeout和setInterval是伪线程. ...

  8. 浅谈JavaScript中的定时器

    引言 使用setTimeout()和setInterval()创建的定时器可以实现很多有意思的功能.很多人认为定时器是一个单独的线程(之前我也是),但是JavaScript是运行在单线程环境中的,而定 ...

  9. 关于定时器 setTimeout

    1.这里不考虑线程问题.把javascript想象成在时间线上运行,页面载入时,首先执行的是<script>标签中的代码,之后,将执行更多代码,当进程空闲时,下个代码就被触发并执行 如图: ...

随机推荐

  1. Pycharm使用教程(四)-安装python依赖包(非常详细,非常实用)

    简介 在做python开发时,需要很多依赖包,如果已经安装pip,安装依赖包,可以通过命令行:没有安装的,也可以通过PyCharm安装. 具体安装步骤 1.在File->Setting,如图: ...

  2. 【Android Studio安装部署系列】二十一、Android studio将项目上传到github中

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 两个相关概念:git和github Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常大的项目版本管理.Git ...

  3. LogcatHelperDemo【应用log信息保存成本地文件】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下LogcatHelper的使用,并对原有代码进行了修改[因为保存到应用内的目录中不需要申请权限,所以去掉保存到SD的功能- ...

  4. 使用FsCheck编写Property-based测试

    使用FsCheck编写Property-based的测试 在编写基于Property-based的单元测试一文中,我们介绍了什么是Property-based测试.同时我们也总结了Property-b ...

  5. Asp.Net Core 轻松学-实现跨平台的自定义Json数据包

    前言     在前后端分离的业务开发中,我们总是需要返回各种各样的数据包格式,一个良好的 json 格式数据包是我们一贯奉行的原则,下面就利用 Json.Net 来做一个简单具有跨平台的序列化数据包实 ...

  6. SLAM+语音机器人DIY系列:(三)感知与大脑——1.ydlidar-x4激光雷达

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  7. celery异步消息处理框架

    Celery 1.什么是Clelery Celery是一个简单.灵活且可靠的,处理大量消息的分布式系统 专注于实时处理的异步任务队列 同时也支持任务调度 Celery架构 Celery的架构由三部分组 ...

  8. EasyUI List<T>转tree数据格式

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  9. [MySQL] mysql的逻辑分层

    mysql逻辑分层:1.client ==>连接层 ==>服务层==>引擎层==>存储层 server2.连接层: 提供与客户端连接的服务3.服务层: 1.提供各种用户使用的接 ...

  10. nginx 启动错误

    场景 在Windows下 启动nginx报错: nginx: [error] ReadFile() : Incorrect function) 解决 因为 nginx.conf 中存在 /* 被认为是 ...