python并发编程调优_Python并发编程-并发解决方案概述
Python并發編程-并發解決方案概述
作者:尹正杰
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
一.并發和并行區別
1>.并行(parallel)
同時做某些事,可以互不干擾的同一個時刻做幾件事。
2>.并發(concurrency)
也是同時做某些事,但是強調,一個時間段內有多少事情要處理。
3>.舉例
高速公路的車道,雙向4車道,所有車輛(數據)可以互不干擾的在自己的車道上行駛(傳輸)。
在同一時刻,每條車道上可能同時又車輛在跑,是同時發生的概念,這是并行。
在一段時間內,又這么多車要通過,這是并發。
二.并發的常見解決方案
"食堂打飯模型":
中午12點,開飯啦,大家都涌向食堂,這就是并發。如果人很多,就是高并發。
1>.隊列,緩沖區
假設只有一個狀況,陸續涌入食堂的人,排隊大財是比較好的方式。
所以,排隊(隊列)是一種天然解決并發的辦法。
排隊就是把人排成隊列,先進先出,解決了資源使用的問題。
排成的隊列,其實就是一個緩沖地帶,就是緩沖區。
假設女生優先,每次都從這個隊伍中優先選出女生來打飯,這就是優先隊列。
例如Queue模塊的類Queue,LifoQueue,PriorityQueue(小頂堆實現)。
2>.爭搶
只開一個這狀況,有可能沒有秩序,也就是誰擠進去就給誰打飯。
擠到窗口的人占據窗口,直到打到飯菜離開。
其他人繼續爭搶,會有一個人占據著窗口,可以視為鎖定窗口,窗口就不能為其他人提供服務了。這就是一種鎖機制。
誰搶到資源就上鎖,排他性的獨占鎖,其他人只能等候。
爭搶也是一種高并發解決方案,但是,這樣可能不好,因為有可能有人很長時間搶不到。
3>.預處理
其實排隊不是問題,就算2萬人拍成一隊等吃飯,如果能10分鐘搞定也行。問題就是并處并發的速度太慢了。
經過分析發現,本食堂主要是打菜等候時間太長,因為每個人都是現場點菜現做。
食堂可以提前統計大多數人最愛吃的菜品,將最愛吃的80%的熱門菜,提前做好,保證供應,20%的冷門菜,現做。
這樣大多數人,就算不排隊采用爭搶的方式鎖定窗口,也很快達到飯菜走了,快速釋放窗口。
這是以中國提前加載用戶需要的數據的思路,預處理思想,緩存常用。
4>.并行
成百上千人同時來吃飯,一個隊伍搞不定的,多開打飯窗口形成多個隊列,如同開多個車道一樣,并行打菜。
開窗口就得擴大食堂,得多古人再窗口提供服務,造成成本上升。高速公路的多車道是并行方案,多車道提高了通信效率,但是也意味著建造維護成本也高了。
日常可以通過購買更多服務器,或多開進程,線程實現并行處理,來解決并發問題。
注意這些都是水平擴展的思想。并行是解決并發手段之一。
溫馨提示:
如果線程在單CPU上處理,就不是真并行了。
但是,現在多數服務器都是多CPU的,至少也是單顆多核CPU,服務的部署往往是多機的,分布式的,這都是并行處理。
5>.提速
提高單個窗口的打飯速度,也是解決并發的方式。
打飯人員提高工作技能,或為單個窗口配更多的服務人員,都是提速的辦法。
提高單個CPU性能,或單個服務器安裝更多CPU。
這是一種垂直擴展思想。
6>.消息中間件
在北京的上地,西二旗地鐵站外九曲回腸的走廊,緩沖人流,進去之后再多口安檢進站。
常見的消息中間件又RabbitMQ,ActiveMQ(Apache),RocketMQ(阿里),kafka(Apache)等。
當然海域哦其它手段解決并發問題,但是已經例舉出了常用的解決方案,一般來說不同的場景用不同的策略,而策略可能是多種方式的優化組合。
例如開食堂(多地),也可以把食堂建設到宿舍生活區(就近原則),所以說,技術來源于生活。
總結
以上是生活随笔為你收集整理的python并发编程调优_Python并发编程-并发解决方案概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usb 进入suspend_USB的挂起
- 下一篇: gitblit如何迁移入gitlab合并