python學習之路 協程 day10

2021-08-06 05:18:26 字數 2816 閱讀 1849

三.協程應用-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之路之協程初認識

協程,又稱微執行緒。與子程式類似,但是又不同於子程式。可以說子程式是協程的乙個特例。協程在執行過程中,可以在子程式某處中斷,轉而去執行其它子程式,然後在某個時間,再被呼叫,回到中斷處繼續執行。舉個栗子 傳統的生產者 消費者模式,一般需要乙個執行緒來寫訊息,另乙個執行緒來獲取訊息,再通過鎖機制來控制佇...