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()
    

    运行结果:

  • 相关阅读:
    Maven 环境的配置
    zTree的简单例子
    plsql免安装客户端的配置
    HDU 1232 畅通工程
    HDU 5698 瞬间移动
    Codeforces 1015E1 Stars Drawing (Easy Edition)
    Codeforces 784B Santa Claus and Keyboard Check
    Codeforces 500C New Year Book Reading
    NSarray 赋值 拷贝 等问题记录
    UINavigationController 操作记录
  • 原文地址:https://www.cnblogs.com/quxikun/p/8384056.html
Copyright © 2011-2022 走看看