zoukankan      html  css  js  c++  java
  • asyncio创建协程解析

    第一步,搭建开发环境

    所需第三方库:

      aiohttp,异步 Web 开发框架;jinja2,前端模板引擎;aiomysql,异步 mysql 数据库驱动

    所需内置库:

      logging,系统日志;asyncio,异步IO;os,系统接口;json,json 编码解码模块;time,系统时间模块;datetime,日期模块

      接下来仅对用到的功能进行讲解

    第二步,构建 Web 框架

    主要思路:

      理解 asyncio、aiohttp 基本应用

      使用 asyncio 异步 IO 模块创建服务协程,监听相应端口

      使用 aiohttp 异步 Web 开发框架,处理 HTTP 请求,构建并返回 HTTP 响应

    完整代码:

    复制代码
     1 import logging; 
     2 logging.basicConfig(level=logging.INFO)
     3 import asyncio, os, json, time
     4 from datetime import datetime
     5 from aiohttp import web
     6 
     7 def index(request):
     8     return web.Response(body=b'<h1>My Bolg</h1>')
     9 
    10 @asyncio.coroutine
    11 def init(loop):
    12     app = web.Application(loop=loop)
    13     app.router.add_route('GET', '/', index)
    14     srv = yield from loop.create_server(app.make_handler(), '127.0.0.1', 9000)
    15     logging.info('server started at http://127.0.0.1:9000...')
    16     return srv
    17 
    18 loop = asyncio.get_event_loop()
    19 loop.run_until_complete(init(loop))
    20 loop.run_forever()
    21 
    22 CompleteCode
    复制代码

    步骤解析:

    一,编写处理函数

    def index(request):
        return web.Response(body=b'<h1>My Bolg</h1>')

    1.函数名随意取。该函数的作用是处理URL,之后将与具体URL绑定

      2.参数aiohttp.web.request实例,包含了所有浏览器发送过来的 HTTP 协议里面的信息,一般不用自己构造

         具体文档参见 http://aiohttp.readthedocs.org/en/stable/web_reference.html

      3.返回值aiohttp.web.response实例,由web.Response(body='')构造,继承自StreamResponse,功能为构造一个HTTP响应

         类声明 class aiohttp.web.Response(*, status=200, headers=None, content_type=None, body=None, text=None)

      4.HTTP 协议格式为: POST /PATH /1.1 /r/n Header1:Value  /r/n .. /r/n HenderN:Valule /r/n Body:Data

     二,创建Web服务器,并将处理函数注册进其应用路径(Application.router)

    app = web.Application(loop=loop)
    app.router.add_route('GET', '/', index)

    1.创建Web服务器实例app,也就是aiohttp.web.Application类的实例,该实例的作用是处理URL、HTTP协议

        1.1 Application,构造函数 def __init__(self, *, logger=web_logger, loop=None,

                           router=None, handler_factory=RequestHandlerFactory,
                             middlewares=(), debug=False):

        1.2使用app时,首先要将URLs注册进router,再用aiohttp.RequestHandlerFactory 作为协议簇创建套接字 

        1.3 aiohttp.RequestHandlerFactory 可以用 make_handle() 创建,用来处理 HTTP 协议,接下来将会看到

       2.将处理函数注册到创建app.router中

        2.1 router,默认为UrlDispatcher实例,UrlDispatcher类中有方法add_route(method, path, handler, *, name=None, expect_handler=None),该方法将处理函数(其参数名为handler)与对应的URL(HTTP方法metho,URL路径path)绑定,浏览器敲击URL时返回处理函数的内容

    三,用协程创建监听服务,并使用aiohttp中的HTTP协议簇(protocol_factory)

    srv = yield from loop.create_server(app.make_handler(), '127.0.0.1', 9000)

    1.用协程创建监听服务,其中loop为传入函数的协程,调用其类方法创建一个监听服务,声明如下

       coroutine BaseEventLoop.create_server(protocol_factory, host=None, port=None, *, family=socket.AF_UNSPEC, flags=socket.AI_PASSIVE, sock=None, backlog=100, ssl=None, reuse_address=None, reuse_port=None)

      2.yield from 返回一个创建好的,绑定IP、端口、HTTP协议簇的监听服务的协程。yield from的作用是使srv的行为模式和 loop.create_server()一致

    四,创建协程,初始化协程,返回监听服务,进入协程执行

    loop = asyncio.get_event_loop()
    loop.run_until_complete(init(loop))
    loop.run_forever()

    1.创建协程,loop = asyncio.get_event_loop(),为asyncio.BaseEventLoop的对象,协程的基本单位。

      2.运行协程,直到完成,BaseEventLoop.run_until_complete(future)

      3.运行协程,直到调用 stop(),BaseEventLoop.run_forever()

    五,补充说明

      1.app,Application

      2.loop,WindowsSelectEventLoop

      3.srv,SocketSever

  • 相关阅读:
    Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源
    Spring Boot 如何给微信公众号返回消息
    Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate
    Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
    Spring Boot 开发微信公众号后台
    Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
    Spring Boot2 系列教程(十六)定时任务的两种实现方式
    Spring Boot2 系列教程(十五)定义系统启动任务的两种方式
    Spring Boot2 系列教程(十四)CORS 解决跨域问题
    JavaScript二维数组
  • 原文地址:https://www.cnblogs.com/sea520/p/10807720.html
Copyright © 2011-2022 走看看