協程 -單線程下實現併發手段

協程 -gevent模塊

  • 和進程、線程都屬於實現併發的手段
  • 一個線程同時處理兩個任務。兩個任務相互切換
  • 協程中任務之間的切換也消耗時間可是遠遠小於線程
    • 協程多少個確認後要.join()才能出結果併發

      #看不出任何效果的協程
        import gevent
      
        def eat():
            print('開始吃飯好吧')
      
        def play():
            print('開始聽歌')
        g1 = gevent.spawn(eat)
        g2 = gevent.spawn(play)
      
        g1.join()   #必須執行join()告訴他就這兩個協程,其餘不加入了
        g2.join()
        #結果
        開始吃飯好吧
        開始聽歌好吧
    • 協程默認是不能識別系統的I/O操做的,默認只能識別gevent.sleep()spa

      import time
        import gevent
      
        def eat():
            print('開始吃飯好吧')
            time.sleep(1)
            print('吃飯結束‘)
      
        def play():
            print('開始聽歌')
            time.sleep(1)
            print('聽歌結束')
      
        g1 = gevent.spawn(eat)
        g2 = gevent.spawn(play)
      
        g1.join()   #必須執行join()告訴他就這兩個協程,其餘不加入了
        g2.join()
        #結果
        開始吃飯好吧
        吃飯結束
        開始聽歌好吧
        聽歌結束
    • 須要在全部的模塊以前加入from gevent import monket;monkey.pach_all()才能識別系統的I/O操做線程

      from gevent import monkey;monket.path_all()
        import time
        import gevent
      
        def eat():
            print('開始吃飯好吧')
            time.sleep(1)
            print('吃飯結束‘)
      
        def play():
            print('開始聽歌')
            time.sleep(1)
            print('聽歌結束')
      
        g1 = gevent.spawn(eat)
        g2 = gevent.spawn(play)
      
        g1.join()   #必須執行join()告訴他就這兩個協程,其餘不加入了
        g2.join()
        #結果
        開始吃飯好吧
        開始聽歌好吧  #基本上是同時打印
        聽歌結束    #一秒後基本上又是同時打印
        吃飯結束
    • .value()可以獲取一個協程的返回值code

  • 總結協程,能夠識別系統的I/O操做繼續另一個任務,將在一個線程中排隊的多個任務之間的I/O時間儘量的利用用來作事情
  • 通常狀況進程起CPU個數+1 (5個)
  • 通常狀況一個進程起線程CPU個數 * 5 (20個)
  • 通常狀況一個線程起協程200個 (200個)
  • 所以通常狀況下一臺計算機起最大線程數20000個

IO模型

相關文章
相關標籤/搜索