aiohttp

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

asyncio的编程模型就是一个消息循环。

asyncio提供了完善的异步IO支持;

异步操作需要在coroutine中通过yield from完成;

多个coroutine可以封装成一组Task然后并发执行。

asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。

asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。

我们先安装aiohttp:

pip install aiohttp
然后编写一个HTTP服务器,分别处理以下URL:

  1. / - 首页返回b'<h1>Index</h1>'
  2. /hello/{name} - 根据URL参数返回文本hello, %s!。 

代码如下:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import asyncio, os, json, time
from datetime import datetime
from aiohttp import web

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import logging
#设置日志等级,默认是WARNING.只有指定级别或更高级的才会被追踪记录
logging.basicConfig(level=logging.INFO)
import asyncio, os, json, time
from datetime import datetime
from aiohttp import web

def index(request):
    #返回web的请求
    return web.Response(body=b'<h1>Awesome</h1>', content_type='text/html', charset='UTF-8')

async def init(loop):
    #创建web应用    创建一个循环类型是消息循环的web应用对象
    app = web.Application(loop=loop)
    app.router.add_route('GET', '/', index)
    #调用子协程:创建一个TCP服务器,绑定到“0.0.0.0:9000”socket,并返回一个服务器对象
    srv = await loop.create_server(app.make_handler(),'0.0.0.0', 9000)
    logging.info('server started at http://0.0.0.0:9000...')
    return srv

loop = asyncio.get_event_loop()         #loop收一个消息循环
loop.run_until_complete(init(loop))     #在消息循环中执行协程
loop.run_forever()


注意aiohttp的初始化函数init()也是一个coroutine,loop.create_server()则利用asyncio创建TCP服务。


猜你喜欢

转载自blog.csdn.net/qingzhou4122/article/details/53503605