python3中异步IO

python2中的gevent通过协程已经实现了异步IO,python3中专门有一个模块来处理异步IO,ascyio模块。

先看一个列子:

import asyncio
import datetime
import time


@asyncio.coroutine
def hello():
    print('任务一 开始了!')
    print('执行中')
    print('遇到了费时操作')
    r = yield from asyncio.sleep(5)
    print(str(r))
    print('任务一 费事操作做完了')
    print('任务一继续')
@asyncio.coroutine
def hello2():
    print('任务二 开始了!')
    print('执行中')
    print('遇到了费时操作')
    r = yield from asyncio.sleep(5)
    print('任务二费事操作做完了')
    print('任务二继续')
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)

运行结果:

任务二 开始了!
执行中
遇到了费时操作
任务一 开始了!
执行中
遇到了费时操作
任务二费事操作做完了
任务二继续
None
任务一 费事操作做完了
任务一继续
0:00:05.003013

从运行结果看,效果和gevent是一样的,即遇到费时操作直接跳到另一个协程里,直到io结束跳回来。

具体实现步骤:

  1. 用@asyncio.coroutine将一个生成器函数变为corutine对象
  2. yield from 表示等待一个费时操作返回结果
  3. 创建loop,将任务添加进去
  4. 运行loop

实际问题中并不会出现sleep这样的费时,async中也封装了各种的io操作,使其支持协程。
下面是对网络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('正在发送请求')
yield from writer.drain()#冲洗缓存区,不知道啥意思,大概是发送请求把,请指正
while True:
print('正在获取数据%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()#关闭连接

loop = asyncio.get_event_loop()
tasks = [ get_hearder(url) for url in (
'www.baidu.com',
'www.souhu.com',
'www.soso.com', # asyncio.open_connection的参数为host,不需要加http

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

运行结果:

``` 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>
正在发送请求
正在获取数据www.baidu.com
www.baidu.com header > HTTP/1.1 200 OK
正在获取数据www.baidu.com
www.baidu.com header > Date: Fri, 21 Jul 2017 06:23:40 GMT
正在获取数据www.baidu.com
www.baidu.com header > Content-Type: text/html
正在获取数据www.baidu.com
www.baidu.com header > Content-Length: 14613
正在获取数据www.baidu.com
www.baidu.com header > Last-Modified: Wed, 28 Jun 2017 02:16:00 GMT
正在获取数据www.baidu.com
www.baidu.com header > Connection: Close
正在获取数据www.baidu.com
www.baidu.com header > Vary: Accept-Encoding
正在获取数据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
正在获取数据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
正在获取数据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
正在获取数据www.baidu.com
www.baidu.com header > P3P: CP=" OTI DSP COR IVA OUR IND COM "
正在获取数据www.baidu.com
www.baidu.com header > Server: BWS/1.1
正在获取数据www.baidu.com
www.baidu.com header > X-UA-Compatible: IE=Edge,chrome=1
正在获取数据www.baidu.com
www.baidu.com header > Pragma: no-cache
正在获取数据www.baidu.com
www.baidu.com header > Cache-control: no-cache
正在获取数据www.baidu.com
www.baidu.com header > Accept-Ranges: bytes
正在获取数据www.baidu.com
正在发送请求
正在获取数据www.soso.com
www.soso.com header > HTTP/1.1 302 Moved Temporarily
正在获取数据www.soso.com
www.soso.com header > Server: nginx
正在获取数据www.soso.com
www.soso.com header > Date: Fri, 21 Jul 2017 06:23:40 GMT
正在获取数据www.soso.com
www.soso.com header > Content-Type: text/html
正在获取数据www.soso.com
www.soso.com header > Content-Length: 154
正在获取数据www.soso.com
www.soso.com header > Connection: close
正在获取数据www.soso.com
www.soso.com header > Location: http://www.sogou.com/?rfrom=soso
正在获取数据www.soso.com
www.soso.com header > Expires: Fri, 21 Jul 2017 06:23:40 GMT
正在获取数据www.soso.com
www.soso.com header > Cache-Control: max-age=0
正在获取数据www.soso.com
正在发送请求
正在获取数据www.souhu.com
www.souhu.com header > HTTP/1.1 301 Moved Permanently
正在获取数据www.souhu.com
www.souhu.com header > Server: Tengine/1.4.2
正在获取数据www.souhu.com
www.souhu.com header > Date: Fri, 21 Jul 2017 06:23:39 GMT
正在获取数据www.souhu.com
www.souhu.com header > Content-Type: text/html
正在获取数据www.souhu.com
www.souhu.com header > Content-Length: 286
正在获取数据www.souhu.com
www.souhu.com header > Connection: close
正在获取数据www.souhu.com
www.souhu.com header > Location: http://127.0.0.1/
正在获取数据www.souhu.com

运行结果里,貌似asycio只把连接当成了费时操作,其他部分都同步了,不知是不是时间太短而忽略掉了,或者是有特殊的调度方法。

总结

async封装了异步io操作,使用它可以方便的用单线程的协程方式实现异步io

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容