一. HTTP协议的相关学习
https://developer.mozilla.org/zh-CN/docs/Web/HTTP
1. OSI七层协议: http://www.cnblogs.com/qishui/p/5428938.html
应用层, 表示层, 会话层, 传输层,网络层, 数据链路层,物理层
2. HTTP的概念:
HTTP是一种能够获取HTML这样的网络的通讯协议, 是一种client-server协议.
3. HTTP的组件
Client ----->Proxy----->Proxy----->Server
Client <-----Proxy<-----Proxy<-----Server
①Client:
含义:用户发起请求的工具,一般是浏览器,也有一些例外,比如工程师使用的程序以及web开发人员调试应用程序.
作用:浏览器先发送一个请求来获取页面的HTML文档, 再解析文档中的资源信息发送其他的请求,获取可执行脚本或CSS样式来进行页面布局渲染,以及一些其他的页面资源(如图片,视频等),然后浏览器将这些资源整合到一起,展现一个完整的文档,即网页.
②Server:
含义:提供客户端所请求的文档,只是虚拟意义上代表一个机器,不一定是一台机器.
③Proxies:
含义:在浏览器和服务器之间,有许多计算机和其他设备转发了HTTP消息.
作用: 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
过滤(像反病毒扫描,家长控制...)
负载均衡(让多个服务器服务不同的请求)
认证(对不同资源进行权限管理)
日志记录(允许存储历史信息)
4. HTTP的基本性质:
简单的, 可扩展的(HTTP header), 无状态, 有会话的(可以使用Cookies创建有状态的会话)
5. HTTP的缓存:
①私有缓存: 单独用户
②共享缓存: 多个用户
6. HTTP Cookie
HTTP Cookie: 是服务器发送到用户浏览器并保存在本地的一小块数据,他会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上.
创建Cookie: 当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项.浏览器收到响应后通常会保存下Cookie.另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定.
Cookie:
会话期间Cookie: 浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。会话期Cookie不需要指定过期时间(Expires
)或者有效期(Max-Age)。
持久性Cookie: 持久性Cookie可以指定一个特定的过期时间(Expires
)或有效期(Max-Age
)。
二. fluent python
14.1
1. 生成器就是迭代器, 因为生成器完全实现了迭代器接口
2. 序列是可以迭代的(iter函数), 因为它都实现了__getitem__方法
3. eg: 解释器需要迭代对象x时, 会自动调用iter(x), 内置的iter函数有以下作用
(1) 检查对象是否实现了__iter__方法, 如果实现了, 就调用它,获取一个迭代器.
(2) 如果没有实现__iter__方法,但实现了__getitem__方法,python会创建一个迭代器,尝试按顺序获取元素.
(3) 如果尝试失败,pyhton会抛出TypeError异常, 提示对象是不可迭代的.
4. 可迭代对象与迭代器的关系: python从可迭代的对象中获取迭代器.可迭代对象有个__iter__方法,每次实例化一个新的迭代器,而迭代器要实现__next__方法,返回单个元素,此外还要实现__iter__方法,返回迭代器本身.迭代器可以迭代,但是可迭代的对象不是迭代器.
5. 迭代器: 实现了无参数的__next__方法, 返回序列中的下一个元素,如果没有元素了,那么就抛出异常.python中的迭代器还实现了__iter__方法,因此迭代器也可以迭代.
7. 可迭代的对象必须实现__iter__方法, 但不能实现__next__方法
8. yield from 可以代替for循环
9. reduce(), sorted(), iter()
10. 所有生成器就是迭代器, 因为生成器完全实现了迭代器的接口
11. range()函数返回一个类似生成器的对象, 若需要返回列表,就list(range(100))
12. 所有的集合都可以迭代, 序列可以迭代
13. 迭代器用于支持: for循环, 构建和扩建集合类型, 逐行遍历文本文件, 列表推导, 元祖拆包等.
14. 序列可以迭代的原因: iter函数
解释器需要迭代对象x时, 会自动调用iter(x)
内置的iter()函数有以下作用:
①检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器.
②如果没有实现__iter__方法,但是实现了__getitem__方法, python会创建一个迭代器,尝试按顺序获取元素.
③如果尝试失败,python会抛出错误
15.任何python序列都可以迭代的原因是,他们都实现了__getitem__方法,其实,标准的序列也都实现了__iter__方法.
16. 检查对象x能否迭代,最准确的方法是:调用iter(x)函数,如果不可迭代,在处理抛出的异常,不考虑使用isinstance(x, abc.Iterable)
17.可迭代的对象和迭代器之间的关系: https://blog.csdn.net/jinixin/article/details/72232604
18.生成器: 特征:有yield关键字
19.python内置的range函数用于生成有穷整数等差数列, itertools.count函数用于生成无穷等差数列(不会停止)
20.eg:
import itertools
gen = itertools.count(1, 1)
next(gen)
Out[4]: 1
next(gen)
Out[5]: 2
next(gen)
Out[6]: 3
next(gen)
Out[7]: 4
...
21.itertools.takewhile函数,他会生成一个使用另一个生成器的生成器,在指定的条件计算结果为false时停止.
eg:
gene = itertools.takewhile(lambda n: n<3, itertools.count(1, .5))
list(gene)
Out[14]: [1, 1.5, 2.0, 2.5]
22. 标准库中的生成器函数 p480
23. 深析iter()函数: 传入两个参数,第一个参数必须是可调用的对象,用于不断调用,产出各个值;第二个参数是哨符,这个是个标记值,当可调用的对象返回这个值时,触发迭代器抛出StopIteration异常,而不产出哨符.
24.迭代和协程无关, 生成器用于生成供迭代的数据,协程是数据的消费者,虽然协程中会使用yield产出值,但是这与迭代无关.
三. python web
1. 消息队列和celery
消息队列(MQ): 提供异步通信协议,可以实现进程间通信或同一进程的不同线程间的通信.消息指包含信息的数据,消息的发送者发送完毕后立即返回,消息被存储进队列中,感兴趣的消费者会订阅消息并接收和处理它.
好处: 应用解耦,异步通信,数据持久化,送达保证.
2. Beanstalkd: 一个高性能,轻量级的分布式内存队列系统,优点:可持久化,支持任务优先级,任务超时重发,支持任务预留,支持分布式.
RabbitMQ:一个实现了AMQP协议标准的开源消息代理和队列服务器,它是企业级消息系统,自带了集群,管理,插件系统等特性,优点:高可用性,可扩展性,易用性.安装: sudo apt-get install rabbitmq-server -yq
安装客户端: pip install pika, RabbitMQ服务器可以连接虚拟主机.也可以编写一个插件系统来使用.
AMQP:高级消息队列协议,是一个异步消息传递所使用的应用层协议规范.
交换机: 四种
流程: 消息的发布者(生产者)-->交换机-->队列-->消息订阅者
信道是建立在TCP连接内的虚拟连接,不直接通过TCP连接发送AMQP命令,是因为是对操作系统而言,创建和销毁TCP连接是很大的开销,而且TCP连接数量有限,一个TCP连接上的信道数量没有限制,性能也非常好.
Celery: 是一个专注于实时处理和任务调用的分布式任务队列,所谓任务就是消息.
应用场景: web应用, 定时任务等
组件: Celery Beat: 任务调度器,把任务发送给任务队列
Celery Worker: 执行任务的消费者
Broker: 消息代理(消息中间件), 从生产者那接收过来的任务消息,存进队列,再按序分发给消费者
Producer: 调用了Celery提供的API,函数或者装饰器而产生任务并交给任务队列处理的都是任务的生产者
Result Backend: 任务处理完后保存状态信息和结果,以供查询
Celery序列化: pickle,json,yaml,msgpack
启动Celery命令:
Celery的依赖: billiard(一个多进程模块), librabbitmq(一个C语言实现的python客户端), kombu(自带的用来收发消息的库)
Celery监控和管理的命令:
3. 服务化
RPC(远程过程调用): 是一个计算机通信协议,此协议允许进程间通信,RPC框架屏蔽了底层的传输方式(UDP/TCP),序列化和反序列化等内容,使用框架只需要知道被调用者的地址和接口就可以了,无需额外为这些底层内容编程.
简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
主流的RPC框架: Thrift: fackbook开源的跨语言框架
Avro: Hadoop的子项目
gRPC:
RPC与restful api 什么关系:https://blog.csdn.net/qq_35813265/article/details/81945646
REST API 和 RPC 都是把一个个函数封装成接口暴露出去,以供调用
不过 REST API 一般都是基于 HTTP 协议,而 RPC 则可以不基于 HTTP
因此,如果是后端两种语言互相调用,用 RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西),应该也更容易配置
如果是前端通过 AJAX 调用后端,那么用 REST API 的形式比较好(因为无论如何也避不开 HTTP 这道坎)