1.協程html
協程,又稱微線程,纖程。英文名Coroutine。 主要解決IO操做python
優勢1: 協程極高的執行效率。由於子程序切換不是線程切換,是用戶態切換,是由程序自身控制,所以,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優點就越明顯。web
優勢2: 不須要多線程的鎖機制,由於只有一個線程,也不存在同時寫變量衝突,在協程中控制共享資源不加鎖,只須要判斷狀態就行了,因此執行效率比多線程高不少。多線程
由於協程是一個線程執行,那怎麼利用多核CPU呢?實現併發,最簡單的方法是多進程+協程,既充分利用多核,又充分發揮協程的高效率,可得到極高的性能。併發
關鍵字:yield send函數
# 簡單實例
import time import queue def consumer(name): print("--->ready to eat baozi...") while True: new_baozi = yield print("[%s] is eating baozi %s" % (name,new_baozi)) #time.sleep(1) def producer(): r = con.__next__() r = con2.__next__() n = 0 while 1: time.sleep(1) print("\033[32;1m[producer]\033[0m is making baozi %s and %s" %(n,n+1) ) con.send(n) con2.send(n+1) n +=2 if __name__ == '__main__': con = consumer("c1") con2 = consumer("c2") p = producer()
greenlet是一個用C實現的協程模塊,相比與python自帶的yield,它能夠使你在任意函數之間隨意切換,而不需把這個函數先聲明爲generator性能
from greenlet import greenlet def test1(): print(12) gr2.switch() print(34) gr2.switch() def test2(): print(56) gr1.switch() print(78) gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch()
'''結果
12
56
34
78
'''
gevent模塊
# 協程底層是經過yield來實現的 # 協程本質上是一個線程 優點: 1.沒有切換的消耗 # 2.沒有鎖的概念 # 問題:1.不能用cpu多核 ,能夠採用多進程+協程 是解決併發的很好方案 # grennlet協程模塊 # gevent import gevent import requests, time start_time = time.time() def f(url): resp = requests.get(url) data = resp.text print("%d bytes received from %s." % (len(data), url)) with open("website.html","w",encoding="utf-8") as f: f.write(data) # 併發執行 gevent.joinall([ gevent.spawn(f, "https://www.python.org"), gevent.spawn(f, "https://www.yahoo.com"), gevent.spawn(f, "https://www.baidu.com"), gevent.spawn(f, "https://www.jd.com"), gevent.spawn(f, "http://www.xiaohuar.com/hua/"), ]) # # 串行運行 # f("https://www.python.org") # f("https://www.yahoo.com") # f("https://www.baidu.com") # f("https://www.jd.com") # f("http://www.xiaohuar.com/hua/") print("cost time: %d" % (time.time()-start_time))