今天不寫**,分享一下關於佇列的思考。高併發在我們的工作當中是乙個經常遇到的問題,一般資料庫效能依賴於硬體,自身並沒有對併發進行控制,更多的時候我們需要從程式設計的角度控制併發,根據伺服器的效能來控制併發量。如果壓力過載,輕則執行如龜速,重則程式崩潰。
下面有這樣乙個場景,有一堆待執行的任務a、b、c、d……x、y、z,a`、b`、c`、d`……x`、y`、z`,共計52個任務。伺服器最多允許10個併發,且a執行的過程中,a`不能同時執行,且這些任務執行順序是隨機的,並不一定是按照abcd的方式順序來執行,那麼此時這一堆任務應該如何執行下去呢?
1、首先,任務最開始執行,肯定是不需要排隊的。
2、對於任務的執行狀態,我們程式是可以檢測到的,找個地方暫存一下或者有直接監測的方式更好。
2、當執行中的任務數量到達10個的時候,此時需要排隊。
3、需要排隊我們就把待執行的任務放到佇列q1中去(此處我們使用redis佇列)。
4、那麼問題來了,a和a`互斥,比如說10個執行中的任務中有a任務,a`作為第11個待執行任務,那麼當b任務執行完,執行中的任務還剩9個,此時,a還沒執行完,那麼顯然不能讓a`執行的。
5、關於a和a`這種互斥的任務,我們可以放到另外乙個佇列中去。
6、此時至少需要兩個佇列,第二個佇列我們叫它q2。
1、q1和q2兩個佇列有可能同時監測到執行器中任務數量小於10,導致執行器中數量超過10。可以通過優先順序控制的方式來解決,或者通過設定不同的監測週期來解決此問題。
2、當執行器中斷,任務狀態也應該清零。不然會導致佇列機制錯亂,故每一次程式啟動時,現將所有任務的執行狀態清零,從零開始。
關於FIFO佇列的思考
有時候我們為了不丟失資料,往往開闢乙個fifo緩衝佇列。其中需要用2個數a和b來分別記錄當前資料應該放入的位置和當前應該取出資料的位置。簡單的fifo佇列在儲存滿時,新來的資料直接丟棄。如果想要丟棄最早接收到的資料,則需要做成環形fifo。對於環形的fifo佇列,只要訪問的速度相當,處理器能保證緩衝...
回頭思考關於xml的使用
前段時間北京來了幾個技術顧問幫忙分析公司的乙個專案的轉換方案,無意間談到了xml的這個話題。兩位專家分析的好,xml是個好東西,但是如果濫用的話那麼系統肯定就廢了,公司的程式設計師也認同,因為以前做的乙個查詢,轉換成xml以後有1個多g的資料,就別提效率了。另外,對於xml的解析多少會影響到效率,如...
回頭思考關於xml的使用
前段時間北京來了幾個技術顧問幫忙分析公司的乙個專案的轉換方案,無意間談到了xml的這個話題。兩位專家分析的好,xml是個好東西,但是如果濫用的話那麼系統肯定就廢了,公司的程式設計師也認同,因為以前做的乙個查詢,轉換成xml以後有1個多g的資料,就別提效率了。另外,對於xml的解析多少會影響到效率,如...