1. socket 发送请求

b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n

这就是固定格式,b字节,get 后必须跟空格然后/ s?wd=alex是百度固定的后缀 后面再来空格 HTTP/1.0\r\n 这也是固定格式 后面再带个host:www.baidu.com同固定格式\r\n\r\n两个结尾

2.解除阻塞

import socketclient = socket.socket()
client.setblocking(False) # 将原来阻塞的位置变成非阻塞(报错)
# 百度创建连接: 阻塞try:client.connect(('www.baidu.com',80)) # 执行了但报错了
except BlockingIOError as e:pass# 检测到已经连接成功# 问百度我要什么?
client.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')# 我等着接收百度给我的回复
chunk_list = []
while True:chunk = client.recv(8096) # 将原来阻塞的位置变成非阻塞(报错)if not chunk:breakchunk_list.append(chunk)body = b''.join(chunk_list)
print(body.decode('utf-8'))

3 io多路复用,检测多个socket是否已经发生变化(是否已经连接成功,是否可以获得数据)可读/可写

import socket
import selectclient1 = socket.socket()
client1.setblocking(False) # 百度创建连接: 非阻塞try:client1.connect(('www.baidu.com',80))
except BlockingIOError as e:passclient2 = socket.socket()
client2.setblocking(False) # 百度创建连接: 非阻塞
try:client2.connect(('www.sogou.com',80))
except BlockingIOError as e:passclient3 = socket.socket()
client3.setblocking(False) # 百度创建连接: 非阻塞
try:client3.connect(('www.oldboyedu.com',80))
except BlockingIOError as e:passsocket_list = [client1,client2,client3]
conn_list = [client1,client2,client3]while True:rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005) #select检测里面的数据有没有变化,如果有人给他发数据,就会检测到变化   他会接收3个元组   但凡rlist有值就是数据返回回来了,但凡wlist返回回来就是连接成功# wlist中表示已经连接成功的socket对象for sk in wlist:if sk == client1:sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n')elif sk==client2:sk.sendall(b'GET /web?query=fdf HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n')else:sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n')conn_list.remove(sk)for sk in rlist:chunk_list = []     #故技重施while True:try:chunk = sk.recv(8096)if not chunk:breakchunk_list.append(chunk)except BlockingIOError as e:breakbody = b''.join(chunk_list)# print(body.decode('utf-8'))print('------------>',body)sk.close()socket_list.remove(sk)if not socket_list:break

4.twisted,基于事件循环实现的异步非阻塞框架   非阻塞:不等待

异步:执行完某个任务后自用调用我给他的函数。  自动下载完回调自己的函数,谁都不等待谁

1.socket 默认是阻塞的 阻塞在连接时,和接收时

2. setblocking(False)   把他变成非阻塞的

3。io多路复用作用为,检测多个socket是否发生了变化   实际是操作系统检测socket是否发生变化,有三种模式

select:限制为1024个socket;内部检测是用的循环

poll:不限个数  但还是内部循环(水平触发)

epoll:不限个数,会调方式(边缘触发)

python中的模块:

  select.select

  select.epoll   win没有

4。提高并发的方案

  多进程

  多线程

  单线程异步非阻塞模块(twisted)scrapy框架(单线程完成并发)

5.异步非阻塞

  非阻塞,不等待,比如创建socket对某个地址进行connect,获取接收数据recv时默认都会等待连接成功,或接收到数据,才执行后续操作,如果设置成setblocking(False)以上两个过程都不再等待但是回报blockingIOError的错,只要捕获即可,

  异步,执行完成之后自动执行回调函数或自动执行某些操作(通知)。

    比如做爬虫中向某个地址xxx发送请求,当请求执行完成之后自动执行回调函数。

6.同步阻塞

  阻塞:等

  同步:按照顺序逐步执行

io多路复用,和

7.在别人不改变的时候,你还想请求完成,只能自己改变

协程

  进程,操作系统中存在;

  线程,操作系统中存在;

  协程,是由程序员创造出来的一个不是真实存在的东西;

  协程,是微线程。对一个线程进行分片,使得线程在代码块之间进行来回切换执行,而不是在原来逐行执行,单纯协程没用,甚至性能降低

import greenletdef 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()             微协程写完了

协程+遇到IO就切换=>牛逼起来了

from gevent import monkey
monkey.patch_all() # 以后代码中遇到IO都会自动执行greenlet的switch进行切换
import requests
import gevent       #上面这些一定要写def get_page1(url):ret = requests.get(url)print(url,ret.content)gevent.joinall([gevent.spawn(get_page1, 'https://www.python.org/'), # 协程1gevent.spawn(get_page1, 'https://www.yahoo.com/'),  # 协程2gevent.spawn(get_page1, 'https://github.com/'),     # 协程3
])

协程也可以称之为 微线程,就是开发者控制线程执行流程,控制先执行某段代码,然后再切换到另外函数执行代码。。。来回切换。

协程不一定可以提高并发,协程自己本身无法提高啊并发,(甚至会降低)。协程+IO切换性能提高。

进程线程区别。

进程是计算机资源分配的最小单元,主要做数据隔离,线程是工作的最小单元,主要工作的就是线程,一个进程里可以有多个线程,一个应用程序里可以有多个进程,应用场景在其他语言里基本没有进程概念,都是用的线程,在python里io操作多的时候,用线程,计算密集型的时候,用进程,因为py有GIL锁,锁住了一个进程中同一时刻只能调用一个线程,无法把cpu完全使用,多线程io不占cpu,程序员为了优化代码,创造了协程,本身不存在,协程本身让人为控制,先执行这个后执行那个,本来没用配合io就有用了,遇到io就执行别的,遇到i o切换到别的地方执行了,把线程分片了,就是让线程一直不停,一直工作,遇到io就切换到别的地方工作,io操作回来的之后再切回来,这点区别吧,py用协程的时候,要用到 greenlet 模块,实现io加协程自动切换的模块gevent

4.单线程提供并发:

  协程+io切换  gevent

  基于事件循环的异步非阻塞框架:twisted

转载于:https://www.cnblogs.com/Mrszhao/p/9647154.html

py 的 第 35 天相关推荐

  1. 使用Cython库包对python的py文件(源码)进行加密,把python的.py文件生成.so文件并调用

    文章目录: 1 准备环境 2 调用`Cython库包`把python的`.py`文件生成`.so`文件 2.1 写源码文件 2.2 调用源码接口 2.3 调用Cython库把`.py`源码生成`.so ...

  2. change python是什么意思_回溯是什么意思?

    我使用django-email-change-0.2.1只是为了更改auth_user-table中的emailaddress.当我要在设置.py. 我收到一条错误消息!在 实际上你可以安装应用程序. ...

  3. 我用 YOLOv5 做情感识别!

    作者 | 陈信达 来源 | Datawhale AI技术已经应用到了我们生活中的方方面面,而目标检测是其中应用最广泛的算法之一,疫情测温仪器.巡检机器人.甚至何同学的airdesk中都有目标检测算法的 ...

  4. 两阶段提交实际项目V1

    项目介绍 两阶段提交项目主要是实际用代码演示复现一下,两阶段提交的执行过程,仅供学习参考.本次主要分析的版本为V1版本,主要实现的流程包括服务端的基础架构编写,客户端的基础架构编写,完成事务提交的过程 ...

  5. yolov5做情感识别

    AI技术已经应用到了我们生活中的方方面面,而目标检测是其中应用最广泛的算法之一,疫情测温仪器.巡检机器人.甚至何同学的airdesk中都有目标检测算法的影子.下图就是airdesk,何同学通过目标检测 ...

  6. micropython驱动lcd_k210 编译micropython LCD驱动失败

    mcu :k210 OS : ubuntu 1804 micropython :1.10.4 RT-thread 4.0.2 menuconfig 中选择 mpy 支持, 选择 machine lcd ...

  7. 使用onnx包将pth文件转换为onnx文件

    本文对比一下两种pth文件转为onnx的区别以及onnx文件在NETRON中的图 只有参数的pth文件:cat_dog.pth 既有参数又有模型结构的pth文件:cat_dog_model_args. ...

  8. python去重复元素_python 去除单个list中的重复元素

    原博文 2020-02-23 08:31 − python中使用set 的方法,去除单个list中重复的元素并且保持元素的先后顺序不变. ``` list1 = ['a','a','b','c','d ...

  9. django 集成个推_持续集成CircleCI vs Travis CI vs Jenkins

    Continuous Integration. CircleCI vs Travis CI vs Jenkins​hackernoon.com 持续集成(CI)的定义及其主要目标 持续集成(CI)是一 ...

  10. django连接MySQL报错Did you install mysqlclient?

    由于项目需求得安装pytorch,但当时想着这个配了老半天,就在原本pytorch环境下安装了django,之后运行报下面错误 django.core.exceptions.ImproperlyCon ...

最新文章

  1. CSS实现网页图片预加载
  2. React 头像插件 react-avatar-editor 的使用
  3. python详细安装教程环境配置-如何安装Python(环境设置)?详细安装步骤图解
  4. 树莓派远程监控的实现
  5. WinCE的网络驱动实现原理
  6. 转: 技巧/诀窍:在ASP.NET中重写URL
  7. linux 档案类型s,深入了解Linuxs归档和压缩命令 | MOS86
  8. java内置的四大函数式接口
  9. 湖南工程学院计算机网期末考试,湖南工程学院__操作系统期末试卷试题
  10. python matplotlib 矢量图svg emf
  11. adm怎么下bt连接_迅雷不能下载版权敏感资源,试试这两款优秀的BT下载神器
  12. qpsk相点 matlab,MATLAB-QPSK在AWGN信道下的仿真
  13. 【Excel】正态分布函数 NORM.DIST / 标准差STDEV.S、STDEV.P
  14. 如何快速绘制一个等边三角形呢?
  15. Windows Installations
  16. antdesign+vue额外展开行expandedRowRender全部展开,并隐藏expandIcon展开收起按钮;antdesign表格嵌套表格
  17. 如何修改C:\Windows\System32\drivers\etc\hosts文件
  18. 经纬度坐标转换高斯-克吕格平面坐标
  19. GlobalProtect bupt for mac
  20. C++入门到精通(xcode IDE)

热门文章

  1. 《sort命令的k选项大讨论》-linux命令五分钟系列之二十七
  2. 关于SQL中Between语句查询日期的问题
  3. (转帖)如何在DE2上安裝μClinux作業系統? (Nios II )
  4. 微信小程序——尤克里里和弦查询
  5. Windws Server 2012 Server Backup(备份与还原)
  6. Lack of free swap space on zabbix,增加swap空间
  7. 关于未在本地计算机上注册“Microsoft.Jet.OleDb.4.0”提供程序的解决办法
  8. libevent eventbuffer读写水位思考
  9. python自定义规律绘制_ForMaiR - 自定义规则的邮件自动转发工具
  10. mysql 添加实例_如何在多实例基础上再添加一个mysql的实例