国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python并發編程協程(Coroutine)之Gevent詳解

2020-02-16 11:20:13
字體:
來源:轉載
供稿:網友

Gevent官網文檔地址:http://www.gevent.org/contents.html

基本概念

我們通常所說的協程Coroutine其實是corporateroutine的縮寫,直接翻譯為協同的例程,一般我們都簡稱為協程。

在linux系統中,線程就是輕量級的進程,而我們通常也把協程稱為輕量級的線程即微線程。

進程和協程

下面對比一下進程和協程的相同點和不同點:

相同點:

我們都可以把他們看做是一種執行流,執行流可以掛起,并且后面可以在你掛起的地方恢復執行,這實際上都可以看做是continuation,關于這個我們可以通過在linux上運行一個hello程序來理解:

shell進程和hello進程:

開始,shell進程在運行,等待命令行的輸入

執行hello程序,shell通過系統調用來執行我們的請求,這個時候系統調用會講控制權傳遞給操作系統。操作系統保存shell進程的上下文,創建一個hello進程以及其上下文并將控制權給新的hello進程。

hello進程終止后,操作系統恢復shell進程的上下文,并將控制權傳回給shell進程

shell進程繼續等待下個命令的輸入

當我們掛起一個執行流的時,我們要保存的東西:

棧,其實在你切換前你的局部變量,以及要函數的調用都需要保存,否則都無法恢復

寄存器狀態,這個其實用于當你的執行流恢復后要做什么

而寄存器和棧的結合就可以理解為上下文,上下文切換的理解:

CPU看上去像是在并發的執行多個進程,這是通過處理器在進程之間切換來實現的,操作系統實現這種交錯執行的機制稱為上下文切換

操作系統保持跟蹤進程運行所需的所有狀態信息。這種狀態,就是上下文。

在任何一個時刻,操作系統都只能執行一個進程代碼,當操作系統決定把控制權從當前進程轉移到某個新進程時,就會進行上下文切換,即保存當前進程的上下文,恢復新進程的上下文,然后將控制權傳遞到新進程,新進程就會從它上次停止的地方開始。

不同點:

執行流的調度者不同,進程是內核調度,而協程是在用戶態調度,也就是說進程的上下文是在內核態保存恢復的,而協程是在用戶態保存恢復的,很顯然用戶態的代價更低

進程會被強占,而協程不會,也就是說協程如果不主動讓出CPU,那么其他的協程,就沒有執行的機會。

對內存的占用不同,實際上協程可以只需要4K的棧就足夠了,而進程占用的內存要大的多

從操作系統的角度講,多協程的程序是單進程,單協程

線程和協程

既然我們上面也說了,協程也被稱為微線程,下面對比一下協程和線程:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阜新市| 乐山市| 临城县| 上高县| 隆昌县| 兰西县| 诸暨市| 儋州市| 冀州市| 上饶市| 怀安县| 阿城市| 来安县| 阳山县| 江津市| 犍为县| 永安市| 呼图壁县| 泸水县| 潮安县| 拜泉县| 峨眉山市| 广丰县| 仁怀市| 从江县| 石屏县| 宝清县| 南丰县| 高安市| 桃江县| 宜昌市| 苍溪县| 翁源县| 南宁市| 沂源县| 亳州市| 平湖市| 北海市| 三原县| 鄂伦春自治旗| 宜宾县|