JS的异步和同步函数

JS异步与同步解析

好久没有写博客了,从7月1日我正式从电子工程师(其实就是写单片机程序的)转为了前端开发(萌新),新工作加班较多,一些知识也没有放在博客上,今天遇到了同步和异步的问题,作为一个新的开始,重新记录。

起源

要弄清楚同步和异步的问题,必须搞清楚js的单线程,以前看书和博客常常看到说“JavaScript是一种异步单线程的变成语言”这句话,以前理解的不太深入,今天通过查询资料,重新学习了一遍,

1. js的单线程含义

js是异步单线程执行的程序,所谓的单线程,只是指js引擎解释和执行的线程只有一个,除了这个线程还有ajax线程、图片加载线程等等,统称为工作线程。所谓的异步是指js的解释和执行线程发起对工作线程执行任务的通知,然后立即返回执行下一步程序,等待工作线程完成要执行的任务,然后通知主线程执行对应的回调函数,成为异步。比如定时函数

settimeout(() => { console.log("哈哈哈")},1000)

其中settimeout是通知定时线程的函数,而箭头函数是定时线程完成定时线程后通知主线程开始执行的回调函数。

2.异步和同步函数

同步:同步是指函数执行完毕后,能够理解得到想要的结果,或者说是能得到一个确定的返回。例如

console.log("abc")

这个同步函数能够立即得到执行的结果,立马输出abc,这就是同步函数。
异步:异步是函数执行完毕后,结果必须在未来经过某种手段才能获得(如 回调函数 等等)。 例如

settimeout(() => { console.log("哈哈哈")},5000)。
console.log("now")

其中,settimeout是主线程对工作线程的一个应用调用通知,执行次应用调用函数后会立即返回执行下面的js程序,但是箭头内部的console。log输出是在未来等待定时工作线程完成5秒的计时后通知主线程,然后执行输出。考虑的在底层一些,也就是eventloop函数轮转调用,console.log(“now”)会立即执行,而console.log(“哈哈哈”)是会在下一轮主线程循环时开始调用(5秒定时到后)

3、js作为服务端的好处

从Node.js考虑,作为web服务器,当java、php、node.js遇到并发时各自的处理情形是:

  1. php:多进程处理,来一个请求,开一个进程
  2. java:多线程,来一个请求,开一个线程,或者默认拥有一个线程池,遇到新连接,从线程池里分配一个。
    
  3. node,js: 异步处理,主线程接受请求,工作线程处理请求。

一般来说第三种处理方式效率最高,但是对于不适用与一些CPU密集型的业务。写到这里,不禁想到后续是否是可以考虑用nodejs的框架egg.js等搭个物联网的broker呢???
嗯,可以尝试一下。。。

同步函数异步函数是编程中两种不同的执行模型,它们在处理任务时的方式、性能特点以及适用场景上存在显著差异。 同步函数按照顺序依次执行,每个操作必须等待前一个操作完成才能开始。这种模式简单直观,适合于那些不需要长时间等待的任务,比如简单的数学计算或者数据处理[^1]。例如,在Python中定义的一个普通函数`sync_function`就是同步执行的,它直接返回结果,并且调用时会阻塞当前线程直到执行完毕。 异步函数则允许程序在等待某个操作(如I/O操作或网络请求)完成的同时继续执行其他任务。这通过使用`async/await`关键字实现,使得代码可以非阻塞地运行[^1]。以Python中的`async_function`为例,该函数模拟了一个异步操作并通过`await asyncio.sleep(1)`来暂停执行而不阻塞整个线程。当处理大量I/O密集型任务时,这种方式能够显著提高应用程序的响应性效率。 JavaScript同样支持异步编程模型,特别是在处理DOM事件、定时器或是AJAX请求等场景下更为常见[^2]。然而,JavaScript中的许多数组迭代方法通常采用同步回调的形式工作,这意味着这些方法会在当前任务结束之前立即执行完毕。 错误处理方面,同步函数可以通过传统的try/catch语句块来捕获异常;而对于异步函数来说,则需要特别注意如何正确地处理Promise链上的错误或者是利用async/await结构内的try/catch机制。 总结来说,选择同步还是异步取决于具体的应用需求: - 如果你的任务相对简单且不涉及长时间的外部资源等待,那么使用同步函数会更加直接方便。 - 对于涉及到文件读写、数据库查询、网络通信等耗时较长的操作,则推荐使用异步函数以避免阻塞主线程并提升整体性能。 ```python # 同步函数示例 def sync_function(): return "Hello, World!" result = sync_function() print(result) # 输出: Hello, World! # 异步函数示例 import asyncio async def async_function(): await asyncio.sleep(1) # 模拟异步操作 return "Hello, World!" async def main(): result = await async_function() print(result) # 输出: Hello, World! # 运行异步函数 asyncio.run(main()) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值