7-5 Python并发网络库常考题
Posted WinvenChang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-5 Python并发网络库常考题相关的知识,希望对你有一定的参考价值。
一、你用过哪些并发网络库?
Tornado vs Gevent vs Asyncio
1.Tornado
并发网络库和同时也是一个web
微框架
2.Gevent
绿色线程(greenlet
)实现并发,猴子补丁修改内置socket
3.Ayncio Python3
内置的并发网络库,基于原生协程
二、Tornado
框架
Tornado
适用于微服务,实现Restful
接口
1.底层基于Linux
多路复用
2.可以通过协程或者回调实现异步编程
3.不过生态不完善,相应的异步框架比如ORM
不完善
异步编程例子:
import tarnado.ioloop
import tornado.web
from tornado.httpclient import AsyncHTTPClient
class APIHandler(tornado.web.RequestHandler):
async def get(self):
url = 'http://httpbin.org/get'
http_client = AsyncHTTPClient()
resp = await http_client.fetch(url)
print(resp.body)
return resp.body
def make_app():
return tornado.web.Application([
(r'/api', APIHandler),
])
if __name__ == '__main__':
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
运行结果:
三、Gevent
高性能的并发网络库
1.基于轻量级绿色线程(greenlet
)实现并发
2.需要注意monkey patch
,gevent
修改了内置的socket
改为非阻塞
3.配合gunicorn
和gevent
部署作为wsgi server
《Gevent
程序员指南》是学习Gevent
的一个比较好的资料
Gevent
爬虫示例:
import gevent.monkey
gevent.monkey.patch_all() # 修改内置的一些库为非阻塞
import gevent
import requests
def fetch():
url = 'http://httpbin.org/get'
resp = requests.get(url)
print(len(resp.text), i)
def asynchronous():
threads = []
for i in range(1, 10):
threads.append(gevent.spawn(fetch, i))
gevent.joinall(threads)
print('Asynchronous: ')
asynchronous()
运行结果:
四、Asyncio
基于协程实现的内置并发网络库
1.Python3
引入到内置,协程+事件循环
2.生态不够完善,滑大规模生产环境检验
3.目前应用不够广泛,基于Aiohttp
可以实现一些小的服务
代码示例:
# 基于 aiohttp 并发请求
import asyncio
from aiohttp import ClientSEssion # pip install aiohttp
async def fetch(url, session):
async with session.get(url) as response:
return await response.read()
async def run(r=10):
url = 'http://httpbin.org/get'
tasks = []
async with ClientSession() as session:
for i in range(r):
task = asyncio.ensure_future(fetch(url, session))
tasks.append(task)
responses = await asyncio.gather(*tasks)
for resp_body in reponses:
print(le(resp_body))
loop = asyncio.get_event_loop()
future = ayncio.ensure_future(run())
loop.run_until_complete(future)
运行结果:
五、本章回顾
TCP
; HTTP
; socket
编程;IO
多路复用;并发网线库
1.TCP
和HTTP
是重点和常考点。善用wireshark
/curl
/httpie
等工具抓包分析请求
2.了解socket
编程原理有助于我们理解框架的实现
3.并发网络库底层一般都是基于IO
多路复用实现
六、网络编程练习题
编写一个异步爬虫类:使用Python
的gevent
或者asyncio
编写一个异步爬虫类
1.你可以选择使用gevent
或者asyncio
(推荐),编写一个异步爬虫类
2.要求1:该类可以传入需要抓取的网址列表。
3.要求2:该类可以通过继承的方式提供一个处理response
的方法。
以上是关于7-5 Python并发网络库常考题的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题