php 堵塞 消息队列,PHP的并发处理
PHP如何處理并發(fā)
什么是進程、線程、協(xié)程
進程 Process計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,“一個執(zhí)行中的程序”
系統(tǒng)進行資源分配和調(diào)度的基本單位
三態(tài)模型:
多道程序系統(tǒng)中,進程在處理器上交替運行,狀態(tài)不斷地發(fā)生變化運行:正在處理機上運行;
就緒:當(dāng)一個進程獲得了除處理機以外的一切所需資源,一旦得到處理機即可運行,則稱處于就緒狀態(tài)。可按多個優(yōu)先級來劃分隊列。如,當(dāng)一個進程由于時間片用完而進入就緒狀態(tài)時,排入低優(yōu)先級;當(dāng)進程由IO操作完成而進入就緒狀態(tài)時,排入高優(yōu)先級隊列。
阻塞:也稱為等待或睡眠狀態(tài),一個進程正在等待某一事件發(fā)生(例如請求IO而等待IO完成等)而暫時停止運行,這時即使把處理機分配給進程也無法運行。
五態(tài)模型:活躍阻塞,是指進程已在主存,一旦等待的事件發(fā)生便進入活躍就緒狀態(tài);
靜止阻塞,進程對換到輔存時的阻塞狀態(tài),一旦等待的事件發(fā)生便進入靜止就緒狀態(tài)。
活躍就緒,指進程在主存并且可被調(diào)度的狀態(tài);
靜止就緒,是指進程被對換到輔存時的就緒狀態(tài),是不能被直接調(diào)度的狀態(tài),只有當(dāng)主存中沒有活躍就緒態(tài)進程,或者是掛起就緒態(tài)進程具有更高的優(yōu)先級,系統(tǒng)將把掛起就緒態(tài)進程調(diào)回主存并轉(zhuǎn)換為活躍就緒。
新建態(tài):進程剛剛被創(chuàng)建時沒有被提交的狀態(tài),等待系統(tǒng)完成創(chuàng)建進程的所有必要信息。
活躍就緒/靜止就緒:
運行:-
活躍阻塞/靜止阻塞:
終止態(tài):進程已結(jié)束運行,回收除進程控制塊之外的其他資源,并讓其他進程從進程控制塊中收集有關(guān)信息。
線程 Thread有時被稱為輕量級進程(LightWeight Process, LWP),程序執(zhí)行流的最小單元。
一個相對獨立的、可調(diào)度的執(zhí)行單元,系統(tǒng)獨立調(diào)度和分配CPU的基本單位。
共享進程的地址空間和資源。
狀態(tài):就緒、阻塞、運行就緒狀態(tài):具備運行的所有條件,邏輯上可以運行,在等待處理機
運行狀態(tài):占有處理機正在運行
阻塞狀態(tài):在等待一個事件(如某個信號量),邏輯上不可執(zhí)行
協(xié)程 Coroutine一種用戶態(tài)的輕量級線程,調(diào)度完全由用戶控制
擁有自己的寄存器上下文和棧
調(diào)度切換時,將寄存器上下文和棧保存到其他地方,切回來的時候恢復(fù),基本沒有內(nèi)核切換的開銷
可以不加鎖的訪問全局變量
異步
什么是多進程、多線程
多進程
同一個時間里,同一個計算機系統(tǒng)中如果允許兩個或兩個以上的進程處于運行狀態(tài),就是多進程
多線程
單個程序中同時運行多個線程完成不同的工作,就是多線程
同步阻塞模型
多進程,最早的服務(wù)端程序都是通過多進程、多線程來解決并發(fā)IO的問題;
一個請求創(chuàng)建一個進程,然后子進程進入循環(huán)同步堵塞地與客戶端連接進行交互,收發(fā)處理數(shù)據(jù)。
多線程,用多線程模式實現(xiàn)非常簡單,線程中直接向某一個客戶端連接發(fā)送數(shù)據(jù)。
缺點嚴重依賴進程的數(shù)量解決并發(fā)問題
啟動大量進程會帶來額外的進程調(diào)度消耗
異步非阻塞模型select 系統(tǒng)的查詢,一個進程內(nèi)建立1024個連接,poll 模型,循環(huán)檢測是否有連接。
現(xiàn)在各種高并發(fā)異步IO的服務(wù)器程序都是基于 epoll 實現(xiàn)的。
IO復(fù)用異步非阻塞程序使用經(jīng)典的 Reactor 模型,顧名思義就是反應(yīng)堆的意思,本身不處理任何數(shù)據(jù)收發(fā)。只是可以監(jiān)視一個socket句柄的事件變化。
Reactor模型Add: 添加一個socket到Reactor
Set: 修改socket對應(yīng)的事件,如可讀可寫
Del: 從Reactor中移除,不再監(jiān)聽事件
Callback: 事件發(fā)生后回調(diào)指定的函數(shù)
Nginx:多線程Reactor
Swoole:多線程Reactor + 多進程Worker
PHP并發(fā)編程實踐
Swoole擴展異步、并行、高性能網(wǎng)絡(luò)通信引擎,使用C語言編寫,提供了PHP語言的異步多線程服務(wù)器,異步TCP/UDP網(wǎng)絡(luò)客戶端,異步MySQL,異步Redis,數(shù)據(jù)庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢
為PHP多進程的模式設(shè)計了多個并發(fā)數(shù)據(jù)結(jié)構(gòu)和IPC通信機制,可以大大簡化多進程并發(fā)編程的工作
Swoole2.0支持了類似Go語言的協(xié)程,可以使用完全同步的代碼實現(xiàn)異步程序
消息隊列經(jīng)典場景,注冊成功后發(fā)送郵件,發(fā)送短信
串行方式:注冊成功后,先發(fā)送郵件,在發(fā)送短信
并行方式:注冊成功后,同時發(fā)送郵件和短信
消息隊列方式(離線方式):注冊成功后,將成功消息寫入隊列,此時直接返回成功給用戶,寫入隊列的時間非常短,可以忽略不計,然后異步發(fā)送郵件和短信 -
應(yīng)用解耦場景說明:用戶下單后,訂單系統(tǒng)需要通知庫存系統(tǒng)。
假如庫存系統(tǒng)無法訪問,則訂單減庫存將失敗,從而導(dǎo)致訂單失敗。
訂單系統(tǒng)與庫存系統(tǒng)耦合
引用隊列,用戶下單后,訂單系統(tǒng)完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。
訂閱下單的消息,采用拉/推的方式,獲取下單信息,庫存系統(tǒng)根據(jù)下單信息,進行庫存操作。
流量削峰秒殺活動,流量瞬時激增,服務(wù)器壓力過大。
用戶發(fā)起請求,服務(wù)器接收后,先寫入消息隊列。假如消息隊列長度超過最大值,則直接報錯或提示用戶。
后續(xù)程序讀取消息隊列再做處理。
控制請求量,緩解高流量。
日志處理場景:解決大量日志的傳輸
日志采集程序?qū)⒊绦驅(qū)懭胂㈥犃?#xff0c;然后通過日志處理程序的訂閱消費日志。
消息通訊場景:聊天室
多個客戶端訂閱同一主題,進行消息發(fā)布和接收
常見消息隊列產(chǎn)品Kafka
ActiveMQ
ZeroMQ
RabbitMQ
Redis
接口的并發(fā)請求
curl_multi_init
總結(jié)
以上是生活随笔為你收集整理的php 堵塞 消息队列,PHP的并发处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在数学中10!代表10的阶乘。既代表1*
- 下一篇: php 获取agent,PHP代码 解析