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

歡迎訪問 生活随笔!

生活随笔

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

php

生产者消费者模式 php 【转】

發(fā)布時間:2025/4/9 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者消费者模式 php 【转】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在工作中常常聽到某某大牛之間的交談會涉及到,xx消費者啊啥的,到底什么大牛之間講的是什么??
這篇文章主要解決三個問題:?
1.到底什么是生產(chǎn)者和消費者,以及它們之間的故事?
2.它們之間靠什么交流?
3.應(yīng)用場景

正文

一、什么是生產(chǎn)者和消費者,以及它們之間的故事

在實際的程序開發(fā)中,會經(jīng)常碰到這樣的情況:小a模塊負責(zé)生產(chǎn)數(shù)據(jù),這些數(shù)據(jù)由另外一個模塊負責(zé)處理。產(chǎn)生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費者。

單單抽象出生產(chǎn)者和消費者,還夠不上是生產(chǎn)者/消費者模式。該模式還需要有一個緩沖區(qū)處于生產(chǎn)者和消費者之間,作為一個中介。生產(chǎn)者把數(shù)據(jù)放入緩沖區(qū),而消費者從緩沖區(qū)取出數(shù)據(jù)。大概的結(jié)構(gòu)如下圖。

可以這么理解,你(生產(chǎn)者)需要寫信寄給基友,你先放到郵箱(緩沖區(qū)),郵遞員(消費者)從郵箱取信進行派送(數(shù)據(jù)處理)。

那么有同學(xué)問了,好好的生產(chǎn)者和消費者直接溝通不就好了,搞出一個緩沖區(qū)是做甚??
其實這是有內(nèi)涵(優(yōu)點)的:

解耦

假設(shè)生產(chǎn)者和消費者都是兩個類,如果直接讓生產(chǎn)者調(diào)消費者的類的方法,勢必會使其依賴于消費者的類方法,萬一消費者的消費方式改變(函數(shù)改掉啦)那么生產(chǎn)者也要改。好了,代碼耦合了。

那么如果有了緩沖區(qū)就不一樣了,兩個都依賴于緩沖區(qū),緩沖區(qū)只起到緩沖數(shù)據(jù)作用,一邊存一邊取,互不關(guān)聯(lián)也不依賴。

ps:你寫信直接交給郵遞員,萬一郵遞員換了,那你不是還要重新認(rèn)識一下,還要關(guān)心是不是真的郵遞員。那如果是放郵箱的話,郵遞員是誰和你半毛錢關(guān)系沒有。

支持并發(fā)

生產(chǎn)者直接調(diào)消費者某個方法有個弊端:由于函數(shù)是同步的,也可以說是阻塞的,消費者沒返回之前,生產(chǎn)者只能一直等著,萬一消費者處理的又很慢,那生產(chǎn)者空閑著就浪費了。?
使用了生產(chǎn)者/消費者模式之后,生產(chǎn)者和消費者可以是兩個獨立的并發(fā)主體。生產(chǎn)者把制造出來的數(shù)據(jù)往緩沖區(qū)一丟,就可以再去生產(chǎn)下一個數(shù)據(jù)?;旧喜挥靡蕾囅M者的處理速度。

ps:如果沒郵箱,你就要站在等郵遞員來,想必這是坑爹的一件事。

支持生產(chǎn)消費者忙閑不均

緩沖區(qū)還有另一個好處。如果制造數(shù)據(jù)的速度時快時慢,緩沖區(qū)的好處就體現(xiàn)出來了。當(dāng)數(shù)據(jù)制造快的時候,消費者來不及處理,未處理的數(shù)據(jù)可以暫時存在緩沖區(qū)中。等生產(chǎn)者的制造速度慢下來,消費者再慢慢處理掉。

ps:萬一今天是情人節(jié)啥的,寄信的人特別多,郵遞員一回只能帶100封,那么多余100封的部分就可以放在郵箱,等處理好100封后再回頭取,繼續(xù)處理。

它們之間靠什么交流

那么生產(chǎn)者和消費者之間怎么交流呢?當(dāng)然是通過數(shù)據(jù)單元交流的。何謂數(shù)據(jù)單元捏?簡單地說,每次生產(chǎn)者放到緩沖區(qū)的,就是一個數(shù)據(jù)單元;每次消費者從緩沖區(qū)取出的,也是一個數(shù)據(jù)單元。

ps:寄信,信就是數(shù)據(jù)單元

那么數(shù)據(jù)單元涉及到一個很關(guān)鍵的問題,就是數(shù)據(jù)粒度的問題。?
有時出于性能等因素的考慮,也可能會把N個業(yè)務(wù)對象打包成一個數(shù)據(jù)單元。那么,這個N該如何取值就是顆粒度的考慮了。顆粒度的大小是有講究的。太大 的顆粒度可能會造成某種浪費;太小的顆粒度可能會造成性能問題。顆粒度的權(quán)衡要基于多方面的因素,以及一些經(jīng)驗值的考量。

ps:還是拿寄信的例子。如果顆粒度過小(比如設(shè)定為1),那郵遞員每次只取出1封信。如果信件多了,那就得來回跑好多趟,浪費了時間。?
如果顆粒度太大(比如設(shè)定為100),那寄信的人得等到湊滿100封信才拿去放入郵筒。假如平時很少寫信,就得等上很久,會很不爽滴~

應(yīng)用場景

那么在php中哪些地方會用到呢,或者說哪些地方會看到別人用到生產(chǎn)者和消費者模式?這里簡單講幾個:

swoole

對,你沒看錯,就是swoole。那么swoole其實是有使用了這個設(shè)計的模式,業(yè)務(wù)邏輯(生產(chǎn)者)將數(shù)據(jù)單元通過swoole的send函數(shù)弄到swoole的一個緩沖區(qū)之間,通過work進程進行分發(fā),task進程(消費者)進行消費。

耗時操作的異步處理

當(dāng)“耗時操作“遇到了”高并發(fā)“,如果不采取一點措施,卡慢崩會慢慢到來,此時可以將要處理的耗時操作的相關(guān)信息(數(shù)據(jù)單元)通過業(yè)務(wù)邏輯[生產(chǎn)者]push到redis隊列中(redis只是舉例),在通過跑一個腳本的進程[消費者]進行pop出數(shù)據(jù)單元進行處理。

?

轉(zhuǎn)載自

http://blog.csdn.net/u011957758/article/details/51138707

轉(zhuǎn)載于:https://www.cnblogs.com/clphp/p/7941290.html

總結(jié)

以上是生活随笔為你收集整理的生产者消费者模式 php 【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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