三.協程應用-greenlet
greenlet和gevent必須要安裝
此處在pycharm上安裝–(必須提前安裝easy_install,pip)
此處用的python27,python30上pip安裝後一直無法使用,會繼續跟進此問題
g2.switch()#切換
print(23)
g2.switch()
deffun
(): print(46)
g1.switch()
print(89)
g1=greenlet(test)#建立協程g1
g2=greenlet(fun))#建立協程g2
g1.switch()#跳轉至協程g1
#執行的結果是 10 46 23 89
#從協程g1開始執行,也就是先執行test(),列印10,跳轉到協程g2
-fun(),列印46,重新跳轉到g1-test(),列印23,跳轉到協程g2
-fun(),列印89
from greenlet import greenlet
deftest
(): print(10)
g2.switch()#切換
print(23)
deffun
(): print(46)
g1.switch()
print(89)
g1=greenlet(test)
g2=greenlet(fun)
g1.switch()
# #執行的結果是 10 46 23
#當其中乙個協程結束,整個程式終止
四.協程應用–gevent
能夠自動切換任務
gevent每次遇到io操作,需要耗時等待時,會自動跳到下乙個協程繼續執行
import gevent
deftest1
(): print("-----in test1-------")
gevent.sleep(2)##用來模擬乙個耗時操作,注意不是time模組中的sleep
print("-----switch1--------")
deftest2
(): print(".....in test2........")
gevent.sleep(2)#每當碰到耗時操作,會自動跳轉至其他協程
print (".....switch2.........")
deftest3
(): print("//in test3")
gevent.sleep(2)
print("///switch3")
gevent.joinall([gevent.spawn(test1),gevent.spawn(test2),gevent.spawn(test3)])
#gevent.joinall相當於
#g1 = gevent.spawn(test1) # 建立乙個協程
#g2 = gevent.spawn(test2)
#g3 = gevent.spawn(test3)
#g1.join() #等待協程執行結束
#g2.join()
#g3.join()
#執行結果如下
#-----in test1-------
#.....in test2........
#/in test3
#-----switch1--------
#///switch3
#.....switch2.........
五.協程-爬蟲
import urllib
import gevent,time
from gevent import monkey
monkey.patch_all()#urllib遇到gevent必須打補丁,把當前所有的io口做上標記
deff
(url):
print("get:%s"%url)
response=urllib.urlopen(url)#首先是urlopen函式,用於開啟乙個url
#urlopen返回乙個類檔案物件, 可以像檔案一樣操作, 同時支援一下三個方法:
#info():返回乙個物件,表示遠端伺服器返回的頭資訊。
data=response.read()
print("%d bytes rece from %s"%(len(data),url))
urls=["",""]
start_time=time.time()
for url in urls:
f(url)
print("cost1:",time.time()-start_time)
async_start_time=time.time()
gevent.joinall(
gevent.spawn(f("")),
gevent.spawn(f(""))
)print("cost2:",time.time()-async_start_time)
執行結果一直報錯
python學習筆記 day40 協程
程序是cpu資源分配的最小單位 執行緒是cpu排程的最小單位 協程就是在乙個執行緒內切換執行任務 之前使用yield也可以實現在乙個主線程中切換執行 def func1 生成器函式 print 吃飯嗎 yield print 那我們走吧 yield deffunc2 g func1 生成器函式在被呼...
python學習 協程
在學習非同步io模型前,我們先來了解協程。協程,又稱微執行緒,纖程。英文名coroutine。協程的概念很早就提出來了,但直到最近幾年才在某些語言 如lua 中得到廣泛應用。子程式,或者稱為函式,在所有語言中都是層級呼叫,比如a呼叫b,b在執行過程中又呼叫了c,c執行完畢返回,b執行完畢返回,最後是...
Python之路之協程初認識
協程,又稱微執行緒。與子程式類似,但是又不同於子程式。可以說子程式是協程的乙個特例。協程在執行過程中,可以在子程式某處中斷,轉而去執行其它子程式,然後在某個時間,再被呼叫,回到中斷處繼續執行。舉個栗子 傳統的生產者 消費者模式,一般需要乙個執行緒來寫訊息,另乙個執行緒來獲取訊息,再通過鎖機制來控制佇...