協程原理:網絡
def go(): print(1) yield(1) #生成器 print(11) yield(11) print(111) yield (111) my=go() #分段執行 print(type(my)) print(next(my))
協程案例切換:url
import greenlet import time def go1(): while True: print("我是小明,雪糕我吃一口") gr2.switch() time.sleep(1) def go2(): while True: print("我是李娜,雪糕我吃一口") gr1.switch() time.sleep(1) if __name__=="__main__": gr1=greenlet.greenlet(go1) gr2=greenlet.greenlet(go2) gr1.switch()
協程開發:spa
import gevent import time """ #執行完須要30秒 showwait("王一",10) showwait("李二",10) showwait("張三",10) """ def showwait(name,n): #name表明名字 #n表明幾秒 for i in range(n): print(name,"等待了",i+1,"秒") gevent.sleep(1) #不須要等待就順序執行,須要等待,自動切換 g1=gevent.spawn(showwait,"龐子卓",10) g2=gevent.spawn(showwait,"韓海飛",10) g3=gevent.spawn(showwait,"李海寶",10) g1.join() #表示加入協程 g2.join() g3.join()
協程網絡下載:code
import gevent import gevent.monkey import urllib.request gevent.monkey.patch_all() #自動切換 def download(url): print("start",url) data=urllib.request.urlopen(url).read() print("length",len(data),url) #打印源代碼的長度,並顯示url #建立一個列表,加載多個任務, #gevent.joinall 表示所有加入協程 gevent.joinall([gevent.spawn(download,"http://www.baidu.com"), gevent.spawn(download,"http://www.163.com"), gevent.spawn(download,"http://www.qq.com"), gevent.spawn(download,"http://www.sina.com"), ])