協程簡介
定義:纖程,微線程.協程的本質是一個單線程程序,所以攜程不能使用計算機多核資源
作用:能夠高效得完成併發任務,佔用較少的資源.因此協程的併發量較高
原理:
通過記錄應用層的上下文棧區,實現在運行中進行上下文跳轉,達到可以選擇性地運行想要運行的部分,以此提高程序的運行效率.
優點:消耗資源少 無需切換開銷 無需同步互斥 IO併發性好
缺點:無法利用計算機多核
greenlet.greenlet() 生成協程對象
import greenlet
def test1():
print(12)
gr2.switch()
print(34)
gr2.switch()
def test2():
print(56)
gr1.switch()
print(78)
#協程對象
gr1 = greenlet.greenlet(test1)
gr2 = greenlet.greenlet(test2)
gr1.switch()
#運行結果
'''
12
56
34
78
'''
gevent介紹
gevent將協程事件封裝爲函數
python中用 f= gevent.spawn(target,args)來參加協程。其中target爲協程調用的方法,args爲方法的參數。示例如下:
import gevent
def foo(a, b):
print("a = %d,b = %d" % (a, b))
gevent.sleep(2)
print("Running foo again")
def bar():
print("Running int bar")
gevent.sleep(3)
print("Running bar again")
#生成協程
f = gevent.spawn(foo, 1, 2)
g = gevent.spawn(bar)
#sleep(3)
print("===============")
gevent.joinall([f, g]) #回收協程
print("%%%%%%%%%%%%%%")
運行結果
===============
a = 1,b = 2
Running int bar
Running foo again
Running bar again
%%%%%%%%%%%%%%
‘’’
注意:設置協程阻塞,讓協程跳轉是gevent.sleep(),而不是time.sleep()
‘’’