python 協程

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))
相關文章
相關標籤/搜索