日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

php 堵塞 消息队列,PHP的并发处理

發(fā)布時間:2023/12/10 php 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 堵塞 消息队列,PHP的并发处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。