如何切換鼠標(如何切換鼠標模式)
940
2022-05-30
文章目錄
前言
什么是協程
相對于線程,協程的優勢
協程的應用
前言
聽說協程挺火,大廠都在用。那得學一下。
什么是協程
協程,英文Coroutines,是一種比線程更加輕量級的存在。正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協程。
子程序,或者稱為函數,在所有語言中都是層級調用,比如A調用B,B在執行過程中又調用了C,C執行完畢返回,B執行完畢返回,最后是A執行完畢。
所以子程序調用是通過棧實現的,一個線程就是執行一個子程序。
子程序調用總是一個入口,一次返回,調用順序是明確的。而協程的調用和子程序不同。
協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然后轉而執行別的子程序,在適當的時候再返回來接著執行。
注意,在一個子程序中中斷,去執行其他子程序,不是函數調用,有點類似CPU的中斷。比如子程序A、B:
def A(): print '1' print '2' print '3' def B(): print 'x' print 'y' print 'z'
1
2
3
4
5
6
7
8
9
假設由協程執行,在執行A的過程中,可以隨時中斷,去執行B,B也可能在執行過程中中斷再去執行A,結果可能是:
1 x 2 y 3 z
1
但是在A中是沒有調用B的,所以協程的調用比函數調用理解起來要難一些。
相對于線程,協程的優勢
最大的優勢就是協程極高的執行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。
第二大優勢就是不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多線程高很多。
因為協程是一個線程執行,那怎么利用多核CPU呢?最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的性能。
協程的應用
有哪些編程語言應用到了協程呢?我們舉幾個栗子:
Lua語言
Lua從5.0版本開始使用協程,通過擴展庫coroutine來實現。
Python語言
正如剛才所寫的代碼示例,python可以通過 yield/send 的方式實現協程。在python 3.5以后,async/await 成為了更好的替代方案。
Go語言
Go語言對協程的實現非常強大而簡潔,可以輕松創建成百上千個協程并發執行。
Java語言
Java語言并沒有對協程的原生支持,但是某些開源框架模擬出了協程的功能。
C++語言
寫這么一篇呢,我的意思很明確,我要學習協程這一塊兒。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。