异步编程小结

        异步编程允许我们在执行一个长时间任务时,程序不需要等待,而是继续执行之后的代码,直到这些任务完成之后再回来通知你,通常是以回调函数的形式。

        异步编程通常是由回调信号和回调函数组成。

       异步编程-运行在单线程优点: 由于所有操作运行在一个线程中,无需考虑线程同步和资源竞争的开销,避免了线程之间的频繁切换和竞争问题,降低了开销。

        asio是通过事件循环处理IO的操作,当事件发生时会调用对应的回调函数。在定时器例子中,使用asio异步模型,我们需要使用任务链的方式,不断地注册新的事件回调,才能达到循环的效果。在回调函数中设置一个异步函数,形成一个任务链。有人会有疑问,在回调函数中调用回调函数,那是不是形成了一个递归。asio是通过事件循环处理IO操作的,这里我们只是重新注册了事件和回调函数。当时间到了,事件被触发后,调用回调函数,而不是一个递归调用。

nodejs异步

JavaScript本身是一个单线程阻塞的同步的语言,在处理js代码的时候,会初始化一个函数调用栈,这个调用栈是唯一的,他的特点是调用栈被一个task占用的时候,它不能执行其他脚本。要解决的就是把阻塞线程的io操作尽快的清理出调用栈,不要让耗时的操作占据线程,nodejs借助事件循环和异步模块实现非阻塞的运行机制,异步模块主要负责处理耗时的io操作和一些异步api的运行,它本身是多线程的,可以同时处理多个任务。事件循环负责监听和派发事件,它通过循环的方式不停地监听异步模块的处理进度等,等处理完成后,事件循环负责将回调函数派发到函数调用栈中去执行,它是事件的调度者,事件循环并不占据单独的线程。

这四行代码算一个任务。然后不停去执行。上面这个图是第一个read()函数执行完,对应的send()函数放入事件循环中,此时调用栈中还有任务,send()函数则需要等待,等到task()任务结束,将send()放入调用栈中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值