<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Python,http on My Blog</title><link>/tags/pythonhttp/</link><description>Recent content in Python,http on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 01 Jul 2016 00:00:00 +0000</lastBuildDate><atom:link href="/tags/pythonhttp/index.xml" rel="self" type="application/rss+xml"/><item><title>Python异步aiohttp</title><link>/2016/07/01/python%E5%BC%82%E6%AD%A5aiohttp/</link><pubDate>Fri, 01 Jul 2016 00:00:00 +0000</pubDate><guid>/2016/07/01/python%E5%BC%82%E6%AD%A5aiohttp/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyncio&lt;/code&gt;可以实现单线程并发IO操作。如果仅用在客户端，发挥的威力不大。如果把&lt;code&gt;asyncio&lt;/code&gt;用在服务器端，例如Web服务器，由于HTTP连接就是IO操作，因此可以用单线程+&lt;code&gt;coroutine&lt;/code&gt;实现多用户的高并发支持。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;asyncio&lt;/code&gt;实现了TCP、UDP、SSL等协议，&lt;code&gt;aiohttp&lt;/code&gt;则是基于&lt;code&gt;asyncio&lt;/code&gt;实现的HTTP框架。&lt;/p&gt;
&lt;p&gt;我们先安装&lt;code&gt;aiohttp&lt;/code&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install aiohttp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后编写一个HTTP服务器，分别处理以下URL：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt; - 首页返回&lt;code&gt;b'&amp;lt;h1&amp;gt;Index&amp;lt;/h1&amp;gt;'&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/hello/{name}&lt;/code&gt; - 根据URL参数返回文本&lt;code&gt;hello, %s!&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import asyncio
from aiohttp import web
async def index(request):
await asyncio.sleep(0.5)
return web.Response(body=b&amp;#39;&amp;lt;h1&amp;gt;Index&amp;lt;/h1&amp;gt;&amp;#39;)
async def hello(request):
await asyncio.sleep(0.5)
text = &amp;#39;&amp;lt;h1&amp;gt;hello, %s!&amp;lt;/h1&amp;gt;&amp;#39; % request.match_info[&amp;#39;name&amp;#39;]
return web.Response(body=text.encode(&amp;#39;utf-8&amp;#39;))
async def init(loop):
app = web.Application(loop=loop)
app.router.add_route(&amp;#39;GET&amp;#39;, &amp;#39;/&amp;#39;, index)
app.router.add_route(&amp;#39;GET&amp;#39;, &amp;#39;/hello/{name}&amp;#39;, hello)
srv = await loop.create_server(app.make_handler(), &amp;#39;127.0.0.1&amp;#39;, 8000)
print(&amp;#39;Server started at http://127.0.0.1:8000...&amp;#39;)
return srv
loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注意&lt;code&gt;aiohttp&lt;/code&gt;的初始化函数&lt;code&gt;init()&lt;/code&gt;也是一个&lt;code&gt;coroutine&lt;/code&gt;，&lt;code&gt;loop.create_server()&lt;/code&gt;则利用&lt;code&gt;asyncio&lt;/code&gt;创建TCP服务。&lt;/p&gt;</description></item></channel></rss>