python 協程的基本概念和使用方法

2021-08-20 20:41:28 字數 2014 閱讀 7967

是單執行緒下的併發,又稱微執行緒,纖程。英文名coroutine。一句話說明什麼是協程:協程是一種使用者態的輕量級執行緒,即協程是由使用者程式自己控制排程的。

python的執行緒屬於核心級別的,即由作業系統控制排程(如單執行緒遇到io或執行時間過長就會被迫交出cpu執行許可權,切換其他執行緒執行)

單執行緒內開啟協程,一旦遇到io,就會從應用程式級別(而非作業系統)控制切換,以此來提公升效率(!!!非io操作的切換與效率無關)

協程的切換開銷更小,屬於程式級別的切換,作業系統完全感知不到,因而更加輕量級

單執行緒內就可以實現併發的效果,最大限度地利用cpu

協程的本質是單執行緒下,無法利用多核,可以是乙個程式開啟多個程序,每個程序內開啟多個執行緒,每個執行緒內開啟協程

協程指的是單個執行緒,因而一旦協程出現阻塞,將會阻塞整個執行緒

必須在只有乙個單執行緒裡實現併發

修改共享資料不需加鎖

使用者程式裡自己儲存多個控制流的上下文棧

附加:乙個協程遇到io操作自動切換到其它協程(如何實現檢測io,yield、greenlet都無法實現,就用到了gevent模組(select機制))

#安裝:pip3 install greenlet

from greenlet import greenlet

defeat

(name):

print('%s eat 1' %name)

g2.switch('egon')

print('%s eat 2' %name)

g2.switch()

defplay

(name):

print('%s play 1' %name)

g1.switch()

print('%s play 2' %name)

g1=greenlet(eat)

g2=greenlet(play)

g1.switch('egon')#可以在第一次switch時傳入引數,以後都不需要

import gevent

from gevent import monkey;monkey.patch_all() # 使用gevent就必須呼叫該模組功能,才能將整個**變為io協程

defeat

(name):

print('%s eat 1' %name)

gevent.sleep(2)

print('%s eat 2' %name)

defplay

(name):

print('%s play 1' %name)

gevent.sleep(1)

print('%s play 2' %name)

g1=gevent.spawn(eat,'egon')

g2=gevent.spawn(play,name='egon')

g1.join()

g2.join()

#或者gevent.joinall([g1,g2])

print('主')

# pip3 install gevent

from gevent import monkey;monkey.patch_all()

import gevent

import time

defeat

(name):

print('%s eat 1' % name)

time.sleep(3)

print('%s eat 2' % name)

defplay

(name):

print('%s play 1' % name)

time.sleep(5)

print('%s play 2' % name)

g1 = gevent.spawn(eat,'zok')

g2 = gevent.spawn(play,'kun')

gevent.joinall([g1, g2])

Python基本概念和基本操作

for迴圈 python中需要注意的問題 參考文獻 變長,可接收任意物件 tuple value 有序可重複 value內容個數均不可變 list value 有序可重複 value內容個數均可變 1.查詢和插入的時間隨著元素的增加而增加 2.占用空間小,浪費記憶體很少 dict map 無序key...

python協程使用 協程的案例

概念 使用者層面在乙個執行緒中進行多工切換的機制,比執行緒更加輕量級 實現併發量更大 協程的使用 使用第三方庫 gevent gevent 是乙個基於協程的 python 網路庫,在遇到 io 阻塞時,程式會自動進行切換,可以讓我們用同步的放肆寫非同步 io 協程的使用 from gevent im...

python基本概念

1.單引號,雙引號與三引號 使用單引號 你可以用單引號指示字串,就如同 quote me on this 這樣。所有的空白,即空格和製表符都照原樣保留。使用雙引號 在雙引號中的字串與單引號中的字串的使用完全相同,例如 what s your name?使用三引號 或 利用三引號,你可以指示乙個多行的...