天天看點

python進階之多任務4(協程2)

3.4.3協程

(1)協程: 又稱為微線程,使用者級線程, 在不開辟線程的基礎上可以完成多任務

(2)如何了解協程: 隻要在def裡面隻看到一個yield關鍵字那麼就可以了解為是一個協程

(3)學習協程的目的: 在單線程的基礎上完成多任務,多個任務按照一定順序交替執行

(4)定義、建立、啟動協程

import time



# 定義協程

def work1():

    while True:

        print("work1…")

        time.sleep(0.2)

        yield



# 定義協程

def work2():

    while True:

        print("work2…")

        time.sleep(0.2)

        yield



if __name__ == '__main__':

    # 建立協程

    g1 = work1()

    g2 = work2()

    while True:

        # 啟動協程

        next(g1)

        next(g2)
           

(5)greenlet的使用

greenlet是對協程進行了封裝,能夠讓程式員更加清楚地知道協程如何切換執行

      例如:

import greenlet

import time



# 任務1

def work1():

    for i in range(10):

        print("work1...")

        time.sleep(0.2)

        # 切換到協程2執行對應的代碼

        g2.switch()



# 任務2

def work2():

    for i in range(10):

        print("work2...")

        time.sleep(0.2)

        # 切換到協程1執行對應的代碼

        g1.switch()





if __name__ == '__main__':

    # 建立協程

    g1= greenlet.greenlet(work1)

    # 建立協程

    g2 = greenlet.greenlet(work2)



    # 切換到協程1執行對應的任務

g1.switch()

           

(6)gevent的使用

import gevent

import time

from gevent import monkey



# 打更新檔,讓gevent能夠識别系統耗時操作,比如:time.sleep,網絡請求延時

# 打更新檔操作要先執行

monkey.patch_all()



# 任務1

def work1():

    for i in range(10):

        print("work1…")

        time.sleep(0.2)

        #gevent.sleep(0.2)



# 任務2

def work2():

    for i in range(10):

        print("work2…")

        time.sleep(0.2)

        #gevent.sleep(0.2)

if __name__ == '__main__':

    # 建立協程并指派任務

    g1 = gevent.spawn(work1)

    # 建立協程并指派任務

    g2 = gevent.spawn(work2)



    # 主動讓線程等待兩個協程執行完成以後程式在退出

    g1.join()

    g2.join()

    #也可寫成:

    #gevent.joinall([g1, g2])
           

(7)程序、線程、協程對比

①程序是作業系統資源配置設定的基本機關

②線程是cpu排程的基本機關,排程那個線程,那個線程執行對應的代碼

③多程序開發比單程序多線程開發穩定性要強,但是多程序開發占用的資源更多

④程序之間不共享全局變量,線程之間共享全局變量,提示:多線程共享全局變量要注意資源競争的問題,解決辦法:互斥鎖,線程同步

⑤線程之間執行是無序的,協程是按照一定順序交替執行的

⑥開辟一個協程大概需要5k,開辟一個線程需要512k,開辟程序需要資源是最大的

⑦協程以後的使用場景: 網絡爬蟲,網絡請求

⑧三者之間的關系是:先有程序,程序裡面預設提供一個線程,線程裡面可以包含多個協程

繼續閱讀