python中IO多路复用、协程
一、IO多路复用
IO多路复用:检测多个socket是否已经发生变化(是否已经连接成功/是否已经获取数据)(可读/可写)
import socket def get_data(key):client = socket.socket()client.setblocking(False) #将原阻塞的位置变成非阻塞try:client.connect(("www.baidu.com",80)) #因为没有等待所以会报错except BlockingIOError as e:passclient.sendall(b"GET /s?wd=%s HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n" %key)data_list = []while 1:data = client.recv(8096)if not data:breakdata_list.append(data)data = b"".join(data_list)print(data.decode("utf8")) key_list = ["alex","sb","db"] for item in key_list:get_data(item)
View Code
二、基于IO多路复用+socket实现并发请求
IO多路复用
socket非阻塞
基于事件循环实现的异步非阻塞框架
非阻塞:不等待
异步:执行完某个人物后自动调用我给他的函数。
Python中开源 基于事件循环实现的异步非阻塞框架 Twisted
总结:
1. socket默认是否是阻塞的?阻塞体现在哪里?
是,connect、accept、recv
2. 如何让socket编程非阻塞?
setblocking(False)
3. IO多路复用作用?
检测多个socket是否发生变化。
操作系统检测socket是否发生变化,有三种模式:
select:最多1024个socket;循环去检测。
poll:不限制监听socket个数;循环去检测(水平触发)。
epoll:不限制监听socket个数;回调方式(边缘触发)。
Python模块:
select.select
select.epoll
4. 提高并发方案:
- 多进程
- 多线程
- 异步非阻塞模块(Twisted) scrapy框架(单线程完成并发)
5. 什么是异步非阻塞?
- 非阻塞,不等待。
比如创建socket对某个地址进行connect、获取接收数据recv时默认都会等待(连接成功或接收到数据),才执行后续操作。
如果设置setblocking(False),以上两个过程就不再等待,但是会报BlockingIOError的错误,只要捕获即可。
- 异步,通知,执行完成之后自动执行回调函数或自动执行某些操作(通知)。
6. 什么是同步阻塞?
- 阻塞:等
- 同步:按照顺序逐步执行
key_list = ['alex','db','sb']
for item in key_list:
ret = requests.get('https://www.baidu.com/s?wd=%s' %item)
print(ret.text)
7.概念
#以前 v = [[11,22],[33,44],[55,66]] #每一个都有一个append方法 for item in v:print(item.append(1)) #以后 class Foo(object):def __init__(self,data):self.data = datadef append(self,ietm):self.data.appded(item) v = [[11,22],[33,44],[55,66]] for item in v:print(item.append(1))
面向对象的思想
三、协程
概念:
进程、操作系统中存在
线程、操作系统中存在
协程、是由程序员创造出来的一个不是真实存在的东西
协程:是微线程,是对一个线程进行分片,使得线程在代码块之间来回切回执行,而不是在原来逐行执行
import greenlet def f1():print(11)gr2.switch()print(22)gr2.switch() def f2():print(33)gr1.switch()print(44) #协程gr1 gr1 = greenlet.greenlet(f1) #协程gr2 gr2 = greenlet.greenlet(f2) gr1.switch()
View Code
注:单纯用协程无用
协程+遇到IO就切换,才真的有用 pip3 install gevent
import gevent from gevent import monkey monkey.patch_all() import requests def get_page1(url):ret = requests.get(url)print(url,ret.content) def get_page2(url):ret = requests.get(url)print(url,ret.content) def get_page3(url):ret = requests.get(url)print(url,ret.content) gevent.joinall([gevent.spawn(get_page1, 'https://www.python.org/'),gevent.spawn(get_page2, 'https://www.yahoo.com/'),gevent.spawn(get_page3, 'https://github.com/')])
View Code
总结:
1什么是协程:
协程也可以成为微线程,基石开发者控制线程执行流程,控制先执行某段代码然后在切换到另外函数执行代码
2.协程可以提高并发么
协程自己本身无法实现并发(甚至性能会降低)
协程+IO切换性能提高
3.进程、线程、协程的区别
4.单线程提高并发:
协程+IO切换:gevent
基于事件循环的异步非阻塞框架:Twisted
twisted
from twisted.web.client import getPage, defer from twisted.internet import reactordef all_done(arg):reactor.stop()def callback(contents):print(contents)deferred_list = [] url_list = ['http://www.bing.com', 'http://www.baidu.com', ] for url in url_list:deferred = getPage(bytes(url, encoding='utf8'))deferred.addCallback(callback)deferred_list.append(deferred)dlist = defer.DeferredList(deferred_list) dlist.addBoth(all_done)reactor.run()
View Code
转载于:https://www.cnblogs.com/qq849784670/p/9641711.html
python中IO多路复用、协程相关推荐
- python协程是什么_在python中线程和协程的区别是什么
在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...
- Python 异步 IO 、协程、asyncio、async/await、aiohttp
From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...
- Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...
- python并发编程:协程asyncio、多线程threading、多进程multiprocessing
python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...
- python并发编程之协程
python并发编程之协程 1.协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞 ...
- python asyncio教程_Python 协程模块 asyncio 使用指南
Python 协程模块 asyncio 使用指南 前面我们通过5 分钟入门 Python 协程了解了什么是协程,协程的优点和缺点和如何在 Python 中实现一个协程.没有看过的同学建议去看看.这篇文 ...
- 服务端异步IO配合协程浅析
服务端异步IO配合协程浅析 代码如下 #coding:utf-8 import socket from selectors import DefaultSelector, EVENT_READ, EV ...
- go test 如何输出到控制台_深度剖析 Go 中的 Go 协程 (goroutines) -- Go 的并发
Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分. 在上次的课程中,我们学习了 Go 的并发模型.由于 Go 协程相对于传统操作系统中 ...
- python中IO编程中关于StringIO的读写问题
阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...
最新文章
- Android View 测量流程(Measure)完全解析
- 最新版mac使用m1芯片,使用nvm安装低版本的node报错问题
- ACM练习 小Z来讲排名规则(WA)【C++ stable_sort稳定排序】
- mysql 注入 file load_Mysql注入中into outfile和load_file()总结
- spring 之 property-placeholder 分析
- 没错,你离分布式搜索只差一个Elasticsearch入门!
- 微信小程序|area组件使用的地址数据文件plus
- Openresty 学习笔记(一)opm 工具的使用
- 虚拟机ubuntu 网速慢的解决方法
- 【动态规划】完全背包问题:构成m的最少个数
- linux指令-动态查看系统资源情况
- dreamweaver php代码提示框,PHP 5.4中的Dreamweaver CS5代码提示和语法错误
- PDF怎么转换成Word?来看这两个方法
- 在运行java程序时出现 Error: could not open c:\program Files\Java\jre6\lib\amd64\jvm.cfg'
- GBase 8c开发接口简述
- python培训班价格-少儿编程培训机构哪家好,儿童编程价格多少钱?家长知多少...
- 大型企业AD架构规划(一)
- QSettings 读写注册表、配置文件
- 神器 工具 推荐 SRDebugger
- 农产品追溯管理软件开发