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()
运行结果:
Python-Blog2-编写Web app 骨架的更多相关文章
- 前端读者 | Web App开发入门
本文来自互联网 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词 - Web App(意为基于WEB形式的应用程序).业界关于Web App与Nativ ...
- 【问题记录】uwsgi部署并启动俩个几乎一样的python flask web app,发现有一个app响应时间非常长
uwsgi在同一台linux上启动python flask web app(俩个), 发现第一个和第二个的简单性能测试差距非常大,差了将近一倍: 第一个结果: Concurrency Level: 1 ...
- python web开发 编写web框架
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143233900 ...
- 【AMAD】splinter -- 用于测试web app的python框架
简介 动机 作用 用法 热度分析 个人评分 简介 Splinter1是一个开源工具,使用Python编写,用于测试web apps.它可以用来对浏览器实现自动化操作,比如访问URLs,和按钮等交互. ...
- 使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道
使用python/casperjs编写终极爬虫-客户端App的抓取-ZOL技术频道 使用python/casperjs编写终极爬虫-客户端App的抓取
- [Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)
[Python+Java双语版自动化测试(接口测试+Web+App+性能+CICD)开学典礼](https://ke.qq.com/course/453802)**测试交流群:549376944**0 ...
- 详解Python Streamlit框架,用于构建精美数据可视化web app,练习做个垃圾分类app
今天详解一个 Python 库 Streamlit,它可以为机器学习和数据分析构建 web app.它的优势是入门容易.纯 Python 编码.开发效率高.UI精美. 上图是用 Streamlit 构 ...
- (数据科学学习手札121)Python+Dash快速web应用开发——项目结构篇
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- Python学习--20 Web开发
HTTP格式 HTTP协议是基于TCP和IP协议的.HTTP协议是一种文本协议. 每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的. HTTP ...
随机推荐
- kotlin的方言(语法糖)
概述 之前介绍了kotlin的快速入门,http://www.cnblogs.com/lizo/p/7231167.html 大多数还是参照java.kotlin中提供了更多更方便的语言特性 这个方言 ...
- 老版VC++线程池
在一般的设计中,当需要一个线程时,就创建一个,但是当线程过多时可能会影响系统的整体效率,这个性能的下降主要体现在:当线程过多时在线程间来回切换需要花费时间,而频繁的创建和销毁线程也需要花费额外的机器指 ...
- jsp数据
---恢复内容开始--- JSP 是什么 JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%>结 ...
- DAY6-小变化(java提示框)-2018-1-16
终于有一点点小变化了,今天学习了java里的对话框,有四种类型:1.确认对话框(showConfirmDialog) 2.可选择输入的对话框(showInputDialog) 3.信息对话框(show ...
- JAVA中的 static使用
主要内容: 1.静态变量 2.静态方法 3.静态代码块 静态变量 我们知道,可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员 ...
- Nginx常用功能(5)
一.反向代理 1.多域名跳转(location) server www.test.com location / { proxy_pass http://192.168.100.100:8080/web ...
- spring使用之旅(一) ---- bean的装配
基础配置 启用组件扫描配置 Java类配置文件方式 package com.springapp.mvc.application; import ...
- 数据挖掘之聚类算法Apriori总结
项目中有时候需要用到对数据进行关联分析,比如分析一个小商店中顾客购买习惯. package com.data.algorithm; import com.google.common.base.Spli ...
- js设计模式之惰性单例模式
<html> <body> <button id="loginBtn">登录</button> </body> < ...
- Quartz 代码调用Demo
一般项目中Quartz都是直接在配置文件中配置,但是一些特殊的情况需要在代码中控制,本文为代码调用的Demo,仅供参考.更多详细的Quartz配置信息,请查看: JAVA定时任务实现的几种方式 mav ...