1. 程式人生 > 程式設計 >簡單瞭解python協程的相關知識

簡單瞭解python協程的相關知識

什麼是協程

協程是python種一種實現多工的方式,他是一種比執行緒更加小的單元,佔用更小的執行單元(資源),為啥說他是一個執行單元,因為他自帶CPU上下文,這樣在合適gr的時機,可以把一個協程切換到另一個協程,只要在這個過程中儲存和恢復cpu上下文那麼程式還是可以執行的

通俗的理解: 一個執行緒中的某個函式,可以在任何地方儲存當前函式的一些臨時變數,然後切換到另一個函式中執行,並且切換的次數以及社麼時候再切換回來是可控的

協程和執行緒的差異

在實現多工時,執行緒會自己歡子一些資料,作業系統切換時需要恢復資料,所以執行緒恢復比較耗效能

協程底層原理(舉例)

'''
1,協程的實現原理,底層通過 yield 實現
'''
def work1(): #工作任務
  for i in range(10):
    print('work1----{}'.format(i))
    yield i
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    yield i
def work3():
  for i in range(10):
    print('work3----{}'.format(i))
    yield i
g1 = work1()
g2 = work2()
g3 = work3()
while True: #迴圈呼叫生成器實現任務切換
  try:
    print(next(g1))
    print(next(g2))
    print(next(g3))
  except StopIteration :
    pass
    break

協程 greenlet

python -m pip install greenlet

示例

'''
1,展示greenelent,不能自動切換需要手動切換
'''
import greenlet
def work1():
  for i in range(10):
     print('work1----{}'.format(i))
     g2.switch()  #切換到g2
def work2():
  for i in range(10):
     print('work2----{}'.format(i))
     g1.switch() #切換到g1
g1 = greenlet.greenlet(work1) #返回協程物件
g2 = greenlet.greenlet(work2)
g1.switch() #啟動開關

執行順序

gevent

greenlet 已經實現了協程,但是還是人工切換,gevent 提供了自動切換功能,其原理是執行過程中遇到IO操作,自動切換

'''
協程gevent IO操作會切換
'''
import gevent
def work1(): # 工作任務
  for i in range(10):
    print('work1----{}'.format(i))
    gevent.sleep(0.5)
def work2():
  for i in range(10):
    print('work2----{}'.format(i))
    gevent.sleep(0.5)
g1 = gevent.spawn(work1) #指定工作函式
g2 = gevent.spawn(work2) #指定工作函式
g1.join()  #等待協程執行完成再往下走
g2.join()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。