异步同步是在于操作系统调用api上,操作系统api分异步同步。比如读取文件,同步调用操作系统会把当前线程挂起,完成之后再恢复。挂起的时候,操作系统就切换到其他线程了,这个新线程可能是另外的线程,也可能是其他进程的线程。异步调用则不同,调用之后操作系统立即返回,并不阻塞,这个时候线程还能去做其他事情,如果文件读取完成了,操作系统会通知成功,然后再去处理。为啥最近都流行异步,主要是异步效率高。同步调用需要创建太多的线程,而且调度不可控,线程调度开销也很大。而异步是没有线程切换的,内部维护一个队列,哪个io完成了就去操作哪个。对于业务代码来说,同步代码容易写,异步一般采用回调,有点反人类思维。有的语言有yield,可以把异步写成同步差不多的代码。而对于类似web服务器来说,异步模式更符合实际,客户端发起http请求,服务器处理请求,事件驱动,业务代码就跟一个插件一样。需要注意的是,在异步模式中,业务代码尽量避免同步调用。否则系统性能会严重下降。同样是高级语言,nginx lua很快,nginx php就很慢,其中一个因素是php没法实现异步。前端范中讲到,而lua跟nginx是绝配,高并发首选。回到题目,异步没有2个线程,只有一个线程。一般为了达到性能顶峰,会启动多个进程,因为cpu是多核的,几个核就启动几个。超过之后越多效率越低。题主应该关心的是文件完成之后线程如何知道,对于一般的来说,就是轮循,等多少时间轮循一次,看起来效率反而低了。那是你这个线程除了等文件读取完成之外没事做。但nginx这样的程序不会没事做,在等一个请求完成文件读取过程中,他可以处理其他请求,等这个文件处理完成了,再来处理原来的请求。但是业务代码要读取一个文件该怎么办呢,nginx并不知道你要读取说文件,也不能知道什么时候完成,就会打破nginx异步模型,导致性能急剧下降。一个方法就是读取文件也交给nginx,把读文件变成一个nginx子请求,这样nginx就能统一管理异步队列了。
异步同步简述
最新推荐文章于 2023-08-27 21:29:51 发布