python 异步IO-aiohttp与简单的异步HTTP客户端/服务器
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320981492785ba33cc96c524223b2ea4e444077708d000
asyncio和Python的异步HTTP客户端/服务器:https://docs.aiohttp.org/en/latest/web_quickstart.html
aiohttp 是基于 asynico 的http框架,由于 asyncio 实现了单线程并发IO操作。如果仅用在客户端,发挥的用处不大。而由于http就是IO操作,所以可以用在服务端。就可以用单线程 +coroutine 实现单线程多用户的高并发支持。
asyncio 实现了TCP、UDP、SSL等协议。 aiohttp 就是基于 asyncio 实现的http框架
接下来作者举了一个例子,来演示了实现多用户高并发的功能:
安装aiohttp
创建一个服务器,处理两个url:
/
- 首页返回b'<h1>Index</h1>'
;
/hello/{name}
- 根据URL参数返回文本hello, %s!
。
代码:
import asyncio
from aiohttp import web async def hello(request):#创建请求处理程序
await asyncio.sleep(0.5)
text='<h1>hello ,%s!</h1>' % request.match_info['name'] #这里的name是在init()里面注册的url里确定的
#return web.Response(body=text.encode('utf-8'))#以特定编码返回要
return web.Response(body=text.encode(),content_type='text/html') async def index(request):
return web.Response(body='<h1>Index</h1>'.encode(), content_type='text/html') async def init(loop):
app = web.Application()#创建application实例
app.router.add_route('GET','/', index)#注册路径与请求处理程序
app.router.add_route('GET','/hello/{name}',hello)#之所以上面能识别name,就是因为在这里定义的。
srv = await loop.create_server(app._make_handler(),'127.0.0.1', 9000)
print('server started at http://127.0.0.1:9000...')
return srv loop=asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
错误
1)我按照老师给的代码运行时,却出现了错误
(web_go) λ python Envs\forTest.py
server started at http://127.0.0.1:9000...
Error handling request
Traceback (most recent call last):
File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\aiohttp\web_protocol.py", line 275,
in data_received
messages, upgraded, tail = self._request_parser.feed_data(data)
File "aiohttp\_http_parser.pyx", line 523, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: invalid HTTP method
Error handling request
Traceback (most recent call last):
File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\aiohttp\web_protocol.py", line 275,
in data_received
messages, upgraded, tail = self._request_parser.feed_data(data)
File "aiohttp\_http_parser.pyx", line 523, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: invalid HTTP method
Error handling request
Traceback (most recent call last):
File "C:\Users\Administrator.SC-201605202132\Envs\web_go\lib\site-packages\aiohttp\web_protocol.py", line 275,
in data_received
messages, upgraded, tail = self._request_parser.feed_data(data)
File "aiohttp\_http_parser.pyx", line 523, in aiohttp._http_parser.HttpParser.feed_data
aiohttp.http_exceptions.BadStatusLine: invalid HTTP method
这个错误我没有解决,来回改了几次之后,发现这个错误也没有了,也不知道是为啥
2)出现了命令行无响应的情况,后来发现使用Ctrl+C没有用,必须在关闭后在刷新一下URL才可以的。
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320981492785ba33cc96c524223b2ea4e444077708d000
3)当请求URL时,响应的文本不会当成HTML解析,而是会作为文件自动下载出来。
解决方法:
async def hello(request):#创建请求处理程序
await asyncio.sleep(0.5)
text='<h1>hello ,%s!</h1>' % request.match_info['name']
#return web.Response(body=text.encode('utf-8'))#以特定编码返回要
return web.Response(body=text.encode(),content_type='text/html')
python 异步IO-aiohttp与简单的异步HTTP客户端/服务器的更多相关文章
- Python网络编程——编写一个简单的回显客户端/服务器应用
今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...
- python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors
一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...
- python网络编程socket编程(TCP、UDP客户端服务器)
摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...
- python2.7_1.14_编写一个简单的回显客户端/服务器应用
1.服务端 server.py # -*- coding: utf-8 -*- import socket import argparse host = 'localhost' data_payloa ...
- python -- 异步IO 协程
python 3.4 >>> import asyncio >>> from datetime import datetime >>> @asyn ...
- [译]Python中的异步IO:一个完整的演练
原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...
- 【Python之路】特别篇--事件驱动与异步IO
通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件 ...
- Python全栈开发-Day10-进程/协程/异步IO/IO多路复用
本节内容 多进程multiprocessing 进程间的通讯 协程 论事件驱动与异步IO Select\Poll\Epoll——IO多路复用 1.多进程multiprocessing Python ...
- 爬虫之多线程 多进程 自定义异步IO框架
什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...
- 多线程,多进程和异步IO
1.多线程网络IO请求: #!/usr/bin/python #coding:utf-8 from concurrent.futures import ThreadPoolExecutor impor ...
随机推荐
- 【原创】Apache和基于虚拟主机的Tomcat集群方案
最近建设了北京某政府机构的网站,网站前段使用Apache做负载均衡,后端使用Tomcat做的集群,基于虚拟主机的方式访问,并且实现了静态资源和动态资源的分离. 开始的建设方案有两种,一种是使用apac ...
- 【原创】rman 全库备份脚本
rman 全库备份脚本 run { allocate channel d1 type disk; allocate channel d2 type disk; backup full database ...
- SAI / PS绘画一个卡通女孩详解
本教程介绍使用SAI / PS绘画一个卡通女孩的教程 ,教程很详细,动起你的小手一起来试试吧! 软件下载:http://www.dongmansoft.com/xiazai.html 想要Get到更多 ...
- Dapper基础知识四之 利用Dapper获取不同类型的主键值
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 一下是Dapper源码几种主键,当主键不包含"ID" ...
- vector ----- size函数注意事项
vector 的size函数返回vector大小,返回值类型为size_type,Member type size_type is an unsigned integral type,即无符号整数: ...
- execlp(3) - Linux手册
名称: execl, execlp, execle, execv, execvp, execvpe:执行文件 总览: #include <unistd.h> extern char **e ...
- 紫书 例题8-17 UVa 1609 (构造法)(详细注释)
这道题用构造法, 就是自己依据题目想出一种可以得到解的方法, 没有什么规律可言, 只能根据题目本身来思考. 这道题的构造法比较复杂, 不知道刘汝佳是怎么想出来的, 我想的话肯定想不到. 具体思路紫书上 ...
- Qt之QSpacerItem
简述 QSpacerItem类为布局提供了一个空白区. 简述 比对 使用 效果 源码 效果 源码 比对 通常情况下,不需要直接使用这个类,Qt内建布局管理器在操控空白区时提供以下功能: 类 函数 QH ...
- 深入C++ new/delete,malloc/free解析
深入C++ new/delete,malloc/free解析 1.malloc与free是C++/C语言的标准库函数.new/delete是C++的运算符. 它们都可用于申请动态内存和释放内存 2.对 ...
- 【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)
[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分 整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘 ...