• Node学习四 —— 函数执行规划


    函数执行

    本来首先应该介绍setTimeoutsetInterval这两个函数的,但是网上的详细教学已经很多了,所以就不再赘述,简单提一下需要掌握的几个点:

    • 在延迟一定时间之后调用函数
    • 取消定时器

    使用process.nextTick将函数推迟到下一轮事件循环

    上面两个延迟函数是在时间纬度上,将代码推迟一段时间然后再执行。而process.nextTick是在内存纬度,等到别的事件都执行完了,再执行需要延迟的代码。

    Node的事件循环在一个处理事件的队列里面循环运行,事件循环每被执行一次就被称为一个Tick。

    通过nextTick来取代setTimeout,回调函数会在事件队列内所有事件处理完毕之后立刻执行,这样效率更高,不用浪费额外时间等待:

    // process是Node中的全局对象!
    process.nextTick(function(){
    	// 自己的代码
    	myFunction();
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    阻塞事件循环

    JS都运行时采用的是单线程事件循环(不懂单线程多线程的可以简单查查概念),当有程序占用了很长的运行时间,那么程序就阻塞在这儿,后面的程序无法执行,会使得服务变得很卡。

    退出事件循环

    通过使用process.nextTick将一个关键性的任务推迟到下一个时间循环再执行,这样可以疏通循环。

    如,要删除之前创建的一个文件,但是又不想在对客户端做出响应之前删除,就可以这样:

    stream.on("data",function(data){
    	stream.end(res);
    	process.nextTick(function(){
    		fs.unlink("./myFile");
    	})
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用setTimeout代替setInterval强制代码串行执行

    假如你希望你的函数重复执行一些I/O操作(比如解析日志文件),可以使用setInterval函数,:

    const interval = 1000;
    setInterval(function(){
    	myF();
    })
    
    • 1
    • 2
    • 3
    • 4

    但是,考虑这样一种情况:你的函数运行时间大于一秒,即大于interval大小,这个时候,你希望串行执行的函数可能不再串行,而是并行,如果你在你的函数中进行发送请求等等操作,时间不确定性还很大,你无法确定怎么设定时间。

    因此,需要强制指定myF执行结束与下一个myF开始之间的时间间隔,可以这么做:

    const interval = 1000;
    (function x(){
    	setTimeout(function (){
    		myF(function(){
    			x();
    		});
    	},interval)
    }());
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上面声明了一个名为x的立即执行函数,里面有个定时器,一秒之后将调用自己的函数,而自己的函数执行完毕后,又会调用作为回调函数的匿名函数,继续执行x,重复上面的过程。

  • 相关阅读:
    Hive 表 DML 操作——Hive 表 DML 操作——第1关:将文件中的数据导入(Load)到 Hive 表中
    基于随机差分变异的改进鲸鱼优化算法-附代码
    C# 消息 界面卡顿 界面进程 工作进程
    Golang 语言学习 01 包含如何快速学习一门新语言
    【操作系统】I/O 管理(二)—— I/O 核心子系统
    什么是自我接纳?如何提高自我接纳度?
    Linux基础教程:7、文件i/o操作补充
    序列化推荐与社会化推荐的区别
    锁机制之 Condition 接口
    C#通过MGet方法快速获取Redis数据库的记录
  • 原文地址:https://blog.csdn.net/qq_51574759/article/details/126775228