python3中異步IO

python2中的gevent通過協(xié)程已經(jīng)實現(xiàn)了異步IO,python3中專門有一個模塊來處理異步IO珊泳,ascyio模塊。

先看一個列子:

import asyncio
import datetime
import time


@asyncio.coroutine
def hello():
    print('任務(wù)一 開始了!')
    print('執(zhí)行中')
    print('遇到了費時操作')
    r = yield from asyncio.sleep(5)
    print(str(r))
    print('任務(wù)一 費事操作做完了')
    print('任務(wù)一繼續(xù)')
@asyncio.coroutine
def hello2():
    print('任務(wù)二 開始了!')
    print('執(zhí)行中')
    print('遇到了費時操作')
    r = yield from asyncio.sleep(5)
    print('任務(wù)二費事操作做完了')
    print('任務(wù)二繼續(xù)')
start=datetime.datetime.now()
loop=asyncio.get_event_loop()
task = [hello(),hello2()]
loop.run_until_complete(asyncio.wait(task))
loop.close()
print(datetime.datetime.now()-start)

運行結(jié)果:

任務(wù)二 開始了!
執(zhí)行中
遇到了費時操作
任務(wù)一 開始了!
執(zhí)行中
遇到了費時操作
任務(wù)二費事操作做完了
任務(wù)二繼續(xù)
None
任務(wù)一 費事操作做完了
任務(wù)一繼續(xù)
0:00:05.003013

從運行結(jié)果看,效果和gevent是一樣的综慎,即遇到費時操作直接跳到另一個協(xié)程里,直到io結(jié)束跳回來好港。

具體實現(xiàn)步驟:

  1. 用@asyncio.coroutine將一個生成器函數(shù)變?yōu)閏orutine對象
  2. yield from 表示等待一個費時操作返回結(jié)果
  3. 創(chuàng)建loop,將任務(wù)添加進去
  4. 運行l(wèi)oop

實際問題中并不會出現(xiàn)sleep這樣的費時丈探,async中也封裝了各種的io操作拔莱,使其支持協(xié)程。
下面是對網(wǎng)絡(luò)io的例子:

``` stylus
import asyncio

@asyncio.coroutine
def get_hearder(url):
print('正在連接%s'%url)
connect = asyncio.open_connection(url,80)
print('connect is %s'%connect)
reader,writer = yield from connect
header = 'GET / HTTP/1.0\r\nHost: %s\r\n\r\n' %url
writer.write(header.encode('utf8'))
print('正在發(fā)送請求')
yield from writer.drain()#沖洗緩存區(qū)讼渊,不知道啥意思尊剔,大概是發(fā)送請求把,請指正
while True:
print('正在獲取數(shù)據(jù)%s'%url)
line = yield from reader.readline()
if line == b'\r\n':
break
print('%s header > %s' % (url, line.decode('utf-8').rstrip()))

writer.close()#關(guān)閉連接

loop = asyncio.get_event_loop()
tasks = [ get_hearder(url) for url in (
'www.baidu.com',
'www.souhu.com',
'www.soso.com', # asyncio.open_connection的參數(shù)為host,不需要加http

)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

運行結(jié)果:

``` stylus
正在連接www.souhu.com
connect is <generator object open_connection at 0x000001B45A1E94C0>
正在連接www.baidu.com
connect is <generator object open_connection at 0x000001B45A1E9620>
正在連接www.soso.com
connect is <generator object open_connection at 0x000001B45A1E97D8>
正在發(fā)送請求
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > HTTP/1.1 200 OK
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Date: Fri, 21 Jul 2017 06:23:40 GMT
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Content-Type: text/html
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Content-Length: 14613
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Last-Modified: Wed, 28 Jun 2017 02:16:00 GMT
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Connection: Close
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Vary: Accept-Encoding
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Set-Cookie: BAIDUID=B275DA6992F2400B0505F9244F6FD742:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Set-Cookie: BIDUPSID=B275DA6992F2400B0505F9244F6FD742; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Set-Cookie: PSTM=1500618220; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > P3P: CP=" OTI DSP COR IVA OUR IND COM "
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Server: BWS/1.1
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > X-UA-Compatible: IE=Edge,chrome=1
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Pragma: no-cache
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Cache-control: no-cache
正在獲取數(shù)據(jù)www.baidu.com
www.baidu.com header > Accept-Ranges: bytes
正在獲取數(shù)據(jù)www.baidu.com
正在發(fā)送請求
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > HTTP/1.1 302 Moved Temporarily
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Server: nginx
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Date: Fri, 21 Jul 2017 06:23:40 GMT
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Content-Type: text/html
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Content-Length: 154
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Connection: close
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Location: http://www.sogou.com/?rfrom=soso
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Expires: Fri, 21 Jul 2017 06:23:40 GMT
正在獲取數(shù)據(jù)www.soso.com
www.soso.com header > Cache-Control: max-age=0
正在獲取數(shù)據(jù)www.soso.com
正在發(fā)送請求
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > HTTP/1.1 301 Moved Permanently
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Server: Tengine/1.4.2
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Date: Fri, 21 Jul 2017 06:23:39 GMT
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Content-Type: text/html
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Content-Length: 286
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Connection: close
正在獲取數(shù)據(jù)www.souhu.com
www.souhu.com header > Location: http://127.0.0.1/
正在獲取數(shù)據(jù)www.souhu.com

運行結(jié)果里京痢,貌似asycio只把連接當成了費時操作,其他部分都同步了臭家,不知是不是時間太短而忽略掉了吭产,或者是有特殊的調(diào)度方法鸭轮。

總結(jié)

async封裝了異步io操作,使用它可以方便的用單線程的協(xié)程方式實現(xiàn)異步io

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邑蒋,一起剝皮案震驚了整個濱河市按厘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卿堂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览绿,死亡現(xiàn)場離奇詭異穗慕,居然都是意外死亡,警方通過查閱死者的電腦和手機逛绵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門术浪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胰苏,你說我怎么就攤上這事〖嗣溃” “怎么了鲤孵?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贵试。 經(jīng)常有香客問我凯正,道長,這世上最難降的妖魔是什么廊散? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任允睹,我火速辦了婚禮,結(jié)果婚禮上胁澳,老公的妹妹穿的比我還像新娘米者。我一直安慰自己宇智,他們只是感情好胰丁,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著太防,像睡著了一般酸员。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幔嗦,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天邀泉,我揣著相機與錄音,去河邊找鬼汇恤。 笑死,一個胖子當著我的面吹牛基括,可吹牛的內(nèi)容都是我干的财岔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桐款,長吁一口氣:“原來是場噩夢啊……” “哼夷恍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裁厅,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤执虹,失蹤者是張志新(化名)和其女友劉穎唠梨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡盖灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年赁炎,在試婚紗的時候發(fā)現(xiàn)自己被綠了钾腺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡姻报,死狀恐怖间螟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厢破,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布褂傀,位于F島的核電站加勤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叠国。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一粟焊、第九天 我趴在偏房一處隱蔽的房頂上張望孙蒙。 院中可真熱鬧,春花似錦香追、人聲如沸坦胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至则果,卻和暖如春漩氨,著一層夾襖步出監(jiān)牢的瞬間短条,已是汗流浹背才菠。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工赋访, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚓耽。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓步悠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼎兽。 傳聞我的和親對象是個殘疾皇子辖众,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容