溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python協(xié)程的示例分析

發(fā)布時間:2021-07-24 10:13:21 來源:億速云 閱讀:162 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)python協(xié)程的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

什么是協(xié)程

協(xié)程是python種一種實(shí)現(xiàn)多任務(wù)的方式,他是一種比線程更加小的單元,占用更小的執(zhí)行單元(資源),為啥說他是一個執(zhí)行單元,因?yàn)樗詭PU上下文,這樣在合適gr的時機(jī),可以把一個協(xié)程切換到另一個協(xié)程,只要在這個過程中保存和恢復(fù)cpu上下文那么程序還是可以運(yùn)行的

通俗的理解: 一個線程中的某個函數(shù),可以在任何地方保存當(dāng)前函數(shù)的一些臨時變量,然后切換到另一個函數(shù)中運(yùn)行,并且切換的次數(shù)以及社么時候再切換回來是可控的

協(xié)程和線程的差異

在實(shí)現(xiàn)多任務(wù)時,線程會自己歡子一些數(shù)據(jù),操作系統(tǒng)切換時需要恢復(fù)數(shù)據(jù),所以線程恢復(fù)比較耗性能

協(xié)程底層原理(舉例)

'''
1,協(xié)程的實(shí)現(xiàn)原理,底層通過 yield 實(shí)現(xiàn)
'''
def work1(): #工作任務(wù)
  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: #循環(huán)調(diào)用生成器實(shí)現(xiàn)任務(wù)切換
  try:
    print(next(g1))
    print(next(g2))
    print(next(g3))
  except StopIteration :
    pass
    break

協(xié)程 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) #返回協(xié)程對象
g2 = greenlet.greenlet(work2)
g1.switch() #啟動開關(guān)

執(zhí)行順序

python協(xié)程的示例分析

gevent

greenlet 已經(jīng)實(shí)現(xiàn)了協(xié)程,但是還是人工切換,gevent 提供了自動切換功能,其原理是執(zhí)行過程中遇到IO操作,自動切換

'''
協(xié)程gevent IO操作會切換
'''
import gevent
def work1(): # 工作任務(wù)
  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) #指定工作函數(shù)
g2 = gevent.spawn(work2) #指定工作函數(shù)
g1.join()  #等待協(xié)程執(zhí)行完成再往下走
g2.join()

關(guān)于“python協(xié)程的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI