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 patchgevent修改了内置的socket改为非阻塞
3.配合gunicorngevent部署作为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.TCPHTTP是重点和常考点。善用wireshark/curl/httpie等工具抓包分析请求
2.了解socket编程原理有助于我们理解框架的实现
3.并发网络库底层一般都是基于IO多路复用实现

六、网络编程练习题

编写一个异步爬虫类:使用Pythongevent或者asyncio编写一个异步爬虫类
1.你可以选择使用gevent或者asyncio(推荐),编写一个异步爬虫类
2.要求1:该类可以传入需要抓取的网址列表。
3.要求2:该类可以通过继承的方式提供一个处理response的方法。

以上是关于7-5 Python并发网络库常考题的主要内容,如果未能解决你的问题,请参考以下文章

7-4 并发编程IO多路复用常见考题

7-4 并发编程IO多路复用常见考题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

HAL库常见报错:烧录成功但是没有运行用户代码

HAL库常见报错:烧录成功但是没有运行用户代码