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