zoukankan      html  css  js  c++  java
  • 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()
    

    运行结果:

  • 相关阅读:
    C++ 数组array与vector的比较
    C/C++头文件区别
    C/C++ 标准输入输出重定向
    C文件读写
    输入输出重定向
    【剑指offer26 二叉搜索树与双向链表】
    【剑指offer25 复杂链表的复制】
    【剑指offer23 二叉搜索树的后序遍历序列】
    【剑指offer22 从上往下打印二叉树 & 60 把二叉树打印成多行】
    【剑指offer21 栈的压入、弹出序列】
  • 原文地址:https://www.cnblogs.com/quxikun/p/8384056.html
Copyright © 2011-2022 走看看