2014年一码中特
首頁 > 編程語言 > 詳細

進程_線程 之(六) --- 協程

時間:2019-08-20 01:59:49      閱讀:40      評論:0      收藏:0      [點我收藏+]

標簽:pan   多個   gevent   cit   應用   http   close   tps   方式   

協程簡介

區別:線程和進程的操作是由程序觸發系統接口,執行者是系統;協程的操作則是程序員。

協程存在的意義:對于多線程應用,CPU通過切片的方式來切換線程間的執行,線程切換時需要耗時(保存狀態,下次繼續)。協程,則只使用一個線程,在一個線程中規定某個代碼塊執行順序。

協成的原理:利用一個線程,分解一個線程成為多個微線程,注意此時從程序級別來分解的

適用場景:當程序中存在大量不需要CPU的操作時(IO),適用于協程;

實現技術

需要手動安裝 greenlet模塊gevent模塊。安裝gevent模塊會默認安裝greenlet模塊

基于底層greenlet實現

 1 from greenlet import greenlet
 2 
 3 def test1():
 4     print(1,2)      # 2.執行輸出語句,輸出1,2
 5     gr2.switch()    # 3.執行完上面輸出語句后,此行調用test2函數  
 6     print(3,4)        # 6.執行輸出語句,輸出3,4
 7     gr2.switch()     # 7.執行完上面輸出語句后,此處調用test2函數
 8 
 9 def test2():
10     print(5,6)     # 4.執行輸出語句,輸出5,6
11     gr1.switch()     # 5.執行完上面輸出語句后,此行調用test1函數
12     print(7,8)     # 8.執行輸出語句,輸出7,8
13 
14 gr1 = greenlet(test1) # 1.調用grl1對應的test1函數
15 gr2 = greenlet(test2)
16 gr1.switch()

 

技術分享圖片
1 1,2
2 5,6
3 3,4
4 7,8
輸出結果

 基于底層gevent實現

 1 import gevent
 2 
 3 def foo():
 4     print(Running in foo)
 5     gevent.sleep(0)
 6     print(Explicit context switch to foo again)
 7 
 8 def bar():
 9     print(Explicit context to bar)
10     gevent.sleep(0)
11     print(Implicit context switch back to bar)
12 
13 gevent.joinall([
14     gevent.spawn(foo),
15     gevent.spawn(bar),
16 ])
技術分享圖片
1 Running in foo
2 Explicit context to bar
3 Explicit context switch to foo again
4 Implicit context switch back to bar
輸出結果

實例

 1 from gevent import monkey; monkey.patch_all()
 2 import gevent
 3 import requests
 4 
 5 def f(url):
 6     print(GET: %s % url)
 7     resp = requests.get(url)
 8     data = resp.text
 9     print(%d bytes received from %s. % (len(data), url))
10 
11 gevent.joinall([
12         gevent.spawn(f, https://www.python.org/),
13         gevent.spawn(f, https://www.yahoo.com/),
14         gevent.spawn(f, https://github.com/),
15 ])
技術分享圖片
1 GET: https://www.python.org/
2 GET: https://www.yahoo.com/
3 GET: https://github.com/
4 431218 bytes received from https://www.yahoo.com/.
5 25529 bytes received from https://github.com/.
6 47394 bytes received from https://www.python.org/.
輸出結果

 

進程_線程 之(六) --- 協程

標簽:pan   多個   gevent   cit   應用   http   close   tps   方式   

原文:https://www.cnblogs.com/TMMM/p/10786226.html

(0)
(0)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 bubuko.com 版權所有 魯ICP備09046678號-4
打開技術之扣,分享程序人生!
             

魯公網安備 37021202000002號

2014年一码中特