阳阳得意7825

导航

Python-Blog2-编写Web app 骨架

撸代码之前让我们先来看几个概念:

什么是协程(Coroutine)?

假设现在有两个子程序,子程序A和子程序B:

def A():
     print('1')
     print('2')
     print('3')
def B():
     print('X')
     print('Y')
     print('Z')

若程序由协程执行,那么输出可能是这样1 2 X Y 3 Z,也就是说协程可以通过程序自身控制,在执行A的过程中中断,然后再去执行B,B执行过程中中断,从A中断的地方继续执行。
python对协程的支持是通过generator实现的,可以通过yield返回生成器,可以通过send接收调用者发出的参数,然后从上次执行中断的位置继续执行。

asyncio

  • @asyncio.coroutine将一个generator标记为coroutine类型
  • event_loop,事件循环,程序开启一个无限循环

aiohttp

asyncio可以实现单线程并发IO操作,如果将asyncio用在服务端,可是通过用单线程+coroutine实现多用户高并发支持,aiohttp就是局域asyncio实现的HTTP框架。

代码实现

创建app.py,代码如下:

#coding:utf-8
'''
说明:Web app 建立在asyncio的基础上,所以这里使用aiohttp写一个基本的app.py
'''

#引入日志模块,将日志的级别设置为INFO(info级输出重要信息)
import logging;logging.basicConfig(level=logging.INFO)
#异步io,指的是你发起一个IO操作,却不用等它结束,可以继续做其他事情,当它结束时,你会得到通知
#交给asyncio执行的任务称为协程(coroutine),一个协程可以放弃执行,或把机会让给其他协程(即yield from 或 await)
import asyncio,os,json,time
#aiohttp是基于asyncio实现的Http框架
from aiohttp import web

#该函数的作用是处理URL,之后与具体URL绑定
def index(request):
    #返回一个HTTP响应
    return  web.Response(body=b'<h1>Awesome</h1>',headers={'content-type':'text/html'})

@asyncio.coroutine
def init(loop):
    #创建Web服务器实例app,处理URL,Http协议
    app=web.Application(loop=loop)
    #将处理函数注册到app.route中
    app.router.add_route('GET','/',index)
    #用协程监听服务
    srv=yield from loop.create_server(app.make_handler(),'127.0.0.1',9000)
    logging.info('server started at http://127.0.0.1:9000....')
    return srv

#获取事件循环
loop=asyncio.get_event_loop()
#执行协程
loop.run_until_complete(init(loop))
#运行协程,直到调用stop()
loop.run_forever()

运行结果:

posted on 2018-01-30 10:58  阳阳得意7825  阅读(165)  评论(0编辑  收藏  举报