信號量-Semaphore
線程的信號量和進(jìn)程的信號量用法無異:
事件-Event
通過event類將兩個方法連接起來進(jìn)行溝通:
線程池-ThreadPoolExecutor
線程池和進(jìn)程池用法是幾乎無異的,但是要注意它導(dǎo)入的模塊,提交的方法,參數(shù)的填寫方法,以及關(guān)閉的方法:
如果涉及返回值的時候呢?
直接打印的話會打印出一串內(nèi)存地址(自己嘗試)這時候需要調(diào)用.result方法(第14行)
但是我們從結(jié)果上看,程序變成了一個同步程序,大大降低了我們的效率。這時候我們可以采用新建列表的方式來進(jìn)行優(yōu)化:
協(xié)程-greenlet
我們都知道:
①進(jìn)程是計算機(jī)中最小的資源分配單位·
②線程是計算機(jī)中能被cpu調(diào)度的最小單位
現(xiàn)在有一個問題:能開啟的線程和進(jìn)程是有限的,但是我們要處理的任務(wù)是無限的。比如我現(xiàn)在有5萬個任務(wù)要執(zhí)行,難道我去開5萬個線程嗎?然后假設(shè)我開了300個線程,但是這300個線程都阻塞了,我仍然沒有充分利用CPU,(理想的情況是開啟一個線程,沒有IO只有計算,這叫充分利用CPU,但大多數(shù)的情況不是這樣的,多多少少會有一些阻塞情況),這時候協(xié)程(纖程)就派上用場了。一條線程在多個任務(wù)之間來回切換,切換這個動作是需要浪費(fèi)時間的,但是對于CPU、操作系統(tǒng)來說,協(xié)程是不存在的,它們只能看見最小單位即線程。把一個線程的工作分成了好幾個任務(wù),在多個任務(wù)中來回切換的現(xiàn)象稱為協(xié)程。
寫一個簡單地生產(chǎn)者消費(fèi)者模型:
①協(xié)程能把一個線程的執(zhí)行明確的區(qū)分開
②兩個任務(wù),協(xié)程幫助我記住哪個任務(wù)執(zhí)行到哪個位置上了,并且實現(xiàn)安全的切換
③一個任務(wù)不得不陷入阻塞了,在這個任務(wù)阻塞的過程中切換到另一個任務(wù)繼續(xù)執(zhí)行
④你的程序只要還有任務(wù)需要執(zhí)行你的當(dāng)前線程永遠(yuǎn)不會阻塞
⑤利用協(xié)程在多個任務(wù)陷入阻塞的時候進(jìn)行切換,來保證一個線程在處理多個任務(wù)的時候總是在忙碌
⑥能夠更加充分的利用cpu,搶占更多的時間片
⑦無論是進(jìn)程還是線程都是由操作系統(tǒng)來切換的,開啟過多的線程、進(jìn)程會給操作系統(tǒng)的調(diào)度增加負(fù)擔(dān)
⑧如果我們是使用的協(xié)程,協(xié)程在程序之間的切換操作系統(tǒng)感知不到
⑨無論開啟多少個協(xié)程對操作系統(tǒng)來說總是一個線程在執(zhí)行,操作系統(tǒng)的調(diào)度不會有任務(wù)的壓力
⑩協(xié)程的本質(zhì)就是一條線程,所以完全不會產(chǎn)生數(shù)據(jù)安全的問題。
對于協(xié)程所需要用到的模塊主要有兩個,greenlet和gevent,其中g(shù)reenlet是gevent的底層邏輯模塊,主要控制協(xié)程的切換(手動),gevent可以當(dāng)做是greenlet的升級版,功能比greenlet更加全面,需要安裝,安裝后即可直接使用。
可以看出,greenlet.switch可以幫助程序員手動切換阻塞,但是如果想要自動切換還需要用到gevent。
協(xié)程-gevent
gevent就是greenlet的完善版:
但是我們?nèi)绻裧event.sleep換成time.sleep呢?
很明顯,阻塞沒有被識別到,所以我們需要用到導(dǎo)入monkey,這樣就能將一些常見的阻塞識別。
審核編輯:劉清
-
線程池
+關(guān)注
關(guān)注
0文章
57瀏覽量
6868 -
線程
+關(guān)注
關(guān)注
0文章
505瀏覽量
19715 -
信號量
+關(guān)注
關(guān)注
0文章
53瀏覽量
8362
發(fā)布評論請先 登錄
相關(guān)推薦
評論