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

首頁 > 編程 > Python > 正文

詳解python之協程gevent模塊

2020-02-15 21:51:27
字體:
來源:轉載
供稿:網友

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

進程、線程、協程區分

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

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

進程和協程

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

相同點:

    相同點存在于,當我們掛起一個執行流的時,我們要保存的東西: 棧, 其實在你切換前你的局部變量,以及要函數的調用都需要保存,否則都無法恢復

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

而寄存器和棧的結合就可以理解為上下文,上下文切換的理解:
CPU看上去像是在并發的執行多個進程,這是通過處理器在進程之間切換來實現的,操作系統實現這種交錯執行的機制稱為上下文切換

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

不同點:

    執行流的調度者不同,進程是內核調度,而協程是在用戶態調度,也就是說進程的上下文是在內核態保存恢復的,而協程是在用戶態保存恢復的,很顯然用戶態的代價更低 進程會被強占,而協程不會,也就是說協程如果不主動讓出CPU,那么其他的協程,就沒有執行的機會。 對內存的占用不同,實際上協程可以只需要4K的棧就足夠了,而進程占用的內存要大的多 從操作系統的角度講,多協程的程序是單進程,單協程

線程和協程

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

    線程之間需要上下文切換成本相對協程來說是比較高的,尤其在開啟線程較多時,但協程的切換成本非常低。 同樣的線程的切換更多的是靠操作系統來控制,而協程的執行由我們自己控制。

協程只是在單一的線程里不同的協程之間切換,其實和線程很像,線程是在一個進程下,不同的線程之間做切換,這也可能是協程稱為微線程的原因吧。

Gevent模塊

Gevent是一種基于協程的Python網絡庫,它用到Greenlet提供的,封裝了libevent事件循環的高層同步API。它讓開發者在不改變編程習慣的同時,用同步的方式寫異步I/O的代碼。

簡單示例:

import geventdef test1():  print 12  gevent.sleep(0)  print 34def test2():  print 56  gevent.sleep(0)  print 78gevent.joinall([  gevent.spawn(test1),  gevent.spawn(test2),])             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿坝县| 广水市| 盐边县| 石嘴山市| 油尖旺区| 大关县| 毕节市| 连平县| 平舆县| 五寨县| 堆龙德庆县| 杭锦旗| 宽城| 扶沟县| 榕江县| 滦南县| 汶上县| 深州市| 筠连县| 梓潼县| 黔江区| 中西区| 合水县| 邢台市| 定边县| 环江| 通海县| 台前县| 乌兰浩特市| 民乐县| 石屏县| 东至县| 宣化县| 舞钢市| 凤山市| 烟台市| 桃园县| 高台县| 聂荣县| 玉林市| 曲靖市|