如何理解PHP同步阻塞、和异步IO?

来自:互联网
时间:2020-02-22
阅读:

至于为什么要写这篇文章,是因为在近日有个小伙伴突然问我,什么是同步?什么是异步?概念是什么?如何理解?

我也相信还是有部分小伙伴在初级开发阶段确实没有太过于关注这个概念?这就说下我的理解!

先科普下IO:(IO)是input和output的缩写,这个词在很多地方都会出现,是什么不用多解释,通常被称为:输入(写),输出(读)。通常就被称为:读写!

同步:大家都知道程序的执行是从上而下的,就像我们平时开发的程序也就是一条线,这样的程序就称为同步。

举个简单的例子来说明一下(用程序实现一个下单流程)

用户提交订单数据->处理数据->调用支付接口->将订单数据保存到数据库->完成支付

用代码实现也就是一步一步的处理,到支付结束为止,这样的代码就是同步代码!

阻塞(同步程序的执行过程的IO等待就被称为阻塞)

正是大家看到的,同步的代码就像是单点操作,需要一步一步的执行下去才能达到目的,那么就需要等待程序从头跑到尾的执行时间,这个执行时间包含了数据运算处理,读写数据库,就比如我们下单过程,我们需要查询数据库订单是否已经存在()、要将订单数据保存到数据库(),程序必须等到读写成功了再执行下一步,在这个等待读写的过程通常就被称为阻塞。通常同步程序都伴随着阻塞,而在PHP程序中不支持多进程,那么并发高的情况下,处理起来必定捉襟见肘了。

那么如何解决阻塞带来的问题?

所以高并发的情况下就引入了redis、消息队列(MQ)、如果能够使用多进程处理也是一个不错的方案,swoole的诞生,我觉得同步程序并发也将不是痛点。

说了同步接下来我们说下下异步?

异步:简单来说就是不需要等待而又完成了同步的事情就被称为异步这个不是所有场景都适用。

下面我们也举一个简单的例子说明一下,我们有一个发送10万条邮件的需求,如果我们使用同步模式,需要发送一封邮件之后才能发送第二封,到10万封也不知道要等待几个日日夜夜了,这样异步的概念就产生了,我先创建一个发送的任务(也就是要把发送的内容和地址存到数据库),后来再写程序让他自动的去发送邮件,这样的程序就被称为异步。

异步的优点:可以很大程度上提升IO,异步程序很大程度上提高了用户体验,异步可以开启多进程处理,swoole 的出现,让PHP的性能可以说能够实现一个飞跃性的成长。

异步的缺点:并不是所有的程序都适合使用异步,而且异步创建进程会有很大的开销,滥用异步反而影响性能。

我就简单的说这么多,我不是给s wo o le打广告,不过是s wo o le是PHP开发工程师进阶之路的一个大机缘。虽然我也没有研究透彻,但是希望我们一起来学习他,使用它,并且能够在项目中去实践,真正的提升开发效率!

返回顶部
顶部