论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
一直让 PHP 程序员懵逼的同步阻塞异步非阻塞,终于搞明 ...
一直让 PHP 程序员懵逼的同步阻塞异步非阻塞,终于搞明白了 ...
魏晓东
金牌会员
|
2024-8-5 09:10:03
|
显示全部楼层
|
阅读模式
楼主
主题
829
|
帖子
829
|
积分
2487
大家好,我是码农先森。
经常听到身边写 Java、Go 的朋友提到程序异步、非阻塞、线程、协程,让系统性能提高到百万、万万并发,使我甚是惊讶属实羡慕。对于常年写 PHP 的我来说,最初听到这几个词时,脑袋一直处于蒙圈状态,回过头来看着自己手上同步阻塞的 PHP 代码,心想着「异步、非阻塞、线程、协程」到底是个什么东东,这么厉害嘛。其实 PHP 中也有线程、协程,但在日常的编程中几乎不会使用,原因是 PHP-FPM 多进程模式下并不支持线程、协程,使用 PHP 编程的程序员绝大多数都离不开 PHP-FPM 。这也就导致了 PHP 程序员对那些概念没有打仗,那就更别提明白了,因此为了广大的 PHP 程序员同胞们能够和 Java、Go 的程序员对上话,专程对「同步、阻塞、异步、非阻塞」这几个概念进行了深度的分析,争取把 PHP 程序员的腰杆挺直溜。
按照惯例先上八股文这道菜:
同步阻塞:当一个操作被调用时,调用者将被阻塞,直到这个操作完成并返回结果。在此期间,调用者无法进行其他使命。
异步阻塞:当一个操作被调用时,调用者不会被阻塞,而是可以继承实验其他使命。然而,它仍然需要等候被调用的操作完成,并在操作完成后处理其结果。这个等候过程可能是阻塞的。
同步非阻塞:调用者发起一个操作后,不会被阻塞并可以继承实验其他使命。虽然调用者可以立即得到控制权,但它仍然需要等候操作完成才气处理结果。在等候的过程中,调用者可以主动轮询大概不停尝试获取操作结果,以制止长时间的阻塞。
异步非阻塞:调用者发起一个操作后,不会被阻塞并可以继承实验其他使命。同时,调用者也不需要等候操作完成来处理结果。相反,调用者可以注册一个回调函数大概使用雷同事件驱动的机制,当操作完成后被自动触发回调函数来处理结果。
基础知识扎实的朋友看这个八股文就足以解惑了,不过看得懂八股文的究竟是少数英俊帅气人,你说气不气人集颜值与才气于一体,别看说的就是各位看官「哈哈」。言归正传,那看不懂八股文的怎么搞?别急,且听我联合生活中的例子娓娓道来。
你每天上班匆匆路过的早餐店,今天额外的多人,你凑近一看原来是来了位身材高挑楚楚动人的美女服务员,结果你按耐不住心中的激动,今天高低得买两个馒头外加一杯豆浆,由于买的人太多,蒸好的馒头早已卖完,这时你只能等正在蒸的,期间你什么也干不了只能眼勾勾的干等着,那么这时的你是同步阻塞的。
由于来买早餐的人越来越多,离上班的时间也越来越近,你开始了骚动,每隔几分钟就问美女服务员馒头蒸好了没?此时的你不再干等,而是开始刷刷抖音看看工作群,由于你已经付钱了所以还是得等馒头,由于美女服务员太忙了没空主动告诉你,需要你自己不停地问,那么这时的你是同步非阻塞的。
过了高峰期人变少了,视野更广阔了,你看美女服务员更清晰了,结果你又开始眼勾勾的干等着,抖音也不刷了工作群的消息也不顾了。由于美女服务员不忙了,开始主动叫那位身穿格子衫背双肩包帅哥,馒头蒸好了,这时的你甩了甩头上的刘海,接过了美女服务员手中的馒头会心一笑,顺便还加了对方的微信,那么此时的你是异步阻塞的。
隔天你为了再睹芳容,又来到了这家早餐店,一向抠门的你甩手就点了两个肉包。这时美女服务员迎面笑脸告知你肉包还需耐烦等候哦,蒸好了会微信关照你。在炎炎的夏季里你路上走的太匆忙,此时的你口渴难耐,就去隔壁小卖部买了瓶82年的可乐,还坐着吹了会空调。随着微信的一声叮咚,你起身去早餐店,接过了美女服务员手中的肉包,那么此时的你是异步非阻塞的。
有了美女服务员的投喂,你工作的干劲都十足了,同时应该也把「同步、阻塞、异步、非阻塞」这几个概念搞懂了吧。其实这里的同步异步和阻塞非阻塞,容易搞混淆就像你看美女服务员容易丢魂一样,在这个例子中同步异步需要关注的是「美女服务员是否会主动的关照你」,主动关照你那么对你来说就是异步的,需要你去扣问那么对你来说就是同步的。阻塞非阻塞需要关注的点是「你是否是眼勾勾的干等着」,如果你只能干等那就是阻塞的,如果你还能干点其他的事情比如刷抖音、买82年的可乐,那么就好坏阻塞的。
美女也看了原理也懂了,有的朋友们又要产生新的疑问了,那在程序中怎么体现、怎么用「同步、阻塞、异步、非阻塞」呢?那我们就开始上代码,究竟看美女服务员的目的也是为了能够深入来往嘛,也就等同于实践上手了,你细品是不是这个理。
开整!
我们先来看
同步阻塞
的例子,使用 socket_create、socket_bind、socket_listen 函数创建绑定并监听了 8080 端口,然后一直阻塞在 socket_accept 函数上,直到有客户端毗连的到来。传统的 PHP-FPM 就是同步阻塞的模式,不过 PHP-FPM 多进程模型,在接收到客户端毗连 $client 后就交给由子进程进行后续的处理了,在这个例子只举例了单进程的模式。
[code]
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
魏晓东
金牌会员
这个人很懒什么都没写!
楼主热帖
基础常用dos命令
Unity技术手册 - Shader实现灵魂状态 ...
云原生之旅 - 14)遵循 GitOps 实践的 ...
.NET主流的几款重量级 ORM框架 ...
Vulnhub靶机-Al-Web-1
火山引擎 DataLeap 计算治理自动化解决 ...
vuluhub_jangow-01-1.0.1
Java集合框架(三)-HashSet
Android studio连接MySQL并完成简单的 ...
弱隔离级别 & 事务并发问题 ...
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表