参考链接: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客户端/服务器的更多相关文章

  1. Python网络编程——编写一个简单的回显客户端/服务器应用

    今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...

  2. python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors

    一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...

  3. python网络编程socket编程(TCP、UDP客户端服务器)

    摘录 python核心编程 使用socket()模块函数创建套接字——通信端点 >>> from socket import * >>> tcpSock = soc ...

  4. python2.7_1.14_编写一个简单的回显客户端/服务器应用

    1.服务端 server.py # -*- coding: utf-8 -*- import socket import argparse host = 'localhost' data_payloa ...

  5. python -- 异步IO 协程

    python 3.4 >>> import asyncio >>> from datetime import datetime >>> @asyn ...

  6. [译]Python中的异步IO:一个完整的演练

    原文:Async IO in Python: A Complete Walkthrough 原文作者: Brad Solomon 原文发布时间:2019年1月16日 翻译:Tacey Wong 翻译时 ...

  7. 【Python之路】特别篇--事件驱动与异步IO

    通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件 ...

  8. Python全栈开发-Day10-进程/协程/异步IO/IO多路复用

    本节内容 多进程multiprocessing 进程间的通讯 协程 论事件驱动与异步IO Select\Poll\Epoll——IO多路复用   1.多进程multiprocessing Python ...

  9. 爬虫之多线程 多进程 自定义异步IO框架

    什么是进程? 进程是程序运行的实例,是系统进行资源分配和调度的一个独立单位,它包括独立的地址空间,资源以及1个或多个线程. 什么是线程? 线程可以看成是轻量级的进程,是CPU调度和分派的基本单位. 进 ...

  10. 多线程,多进程和异步IO

    1.多线程网络IO请求: #!/usr/bin/python #coding:utf-8 from concurrent.futures import ThreadPoolExecutor impor ...

随机推荐

  1. 【原创】读写锁ReentrantReadWriteLock原理分析(一)

    Java里面真正意义的锁并不多,其实真正的实现Lock接口的类就三个,ReentrantLock和ReentrantReadWriteLock的两个内部类(ReentrantReadWriteLock ...

  2. 异步线程编程,线程池,线程组,后面涉及ThreadLocal在理解

    join模拟订单 package com.future.demo.future; /** * * * @author Administrator * */ public class NormalThr ...

  3. 为什么maven 创建web工程不自动生成Deployment Descriptor:工程名

    上面图切换成下面图: 点击eclipse右上角,如下图红圈,然后在选择javaEE这样就切换成javaEE视图了 如果还是不能解决,相信这个链接对你有所帮助:https://www.cnblogs.c ...

  4. 字符串的格式化(转自武sir)

    百分号s方式: (name)      可选,用于选择指定的key flags          可选,可供选择的值有: +       右对齐:正数前加正好,负数前加负号: -        左对齐 ...

  5. HDU-1083 Courses 二分图 最大匹配

    题目链接:https://cn.vjudge.net/problem/HDU-1083 题意 有一些学生,有一些课程 给出哪些学生可以学哪些课程,每个学生可以选多课,但只能做一个课程的代表 问所有课能 ...

  6. nginx 多级7层代理安装配置

    编译安装 yum install zlib-devel -y wget https://nginx.org/download/nginx-1.15.12.tar.gz tar -zxf nginx-1 ...

  7. visio使用技巧

    1.背景放大: 按住Ctrl键,滚动鼠标滚轮,即可调整背景大小,这是改变的显示比例 2.背景: 按住Ctrl+E,在背景边框处拖动图标,即可拉大或者缩小背景,这是实际更改背景大小.

  8. 紫书 习题8-10 UVa 1614 (贪心+结论)

    这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...

  9. EBS OAF开发中怎样通过ReferenceAO进行验证

    EBS OAF开发中怎样通过ReferenceAO进行验证 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) Reference AO 除了用于 ...

  10. poj3252-Round Number 组合数学

    题目: Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8492   Accepted: 2963 ...