1.7~1.11学习笔记

一. HTTP协议:

1. CORS: 跨域资源共享, 是一种机制, 它使用额外的HTTP头来告诉浏览器,让运行在一个origin(domain)上的web应用被准许访问来自不同源服务器上的指定的资源.当一个资源从与该资源本身所在的服务器不同的域,协议或端口请求一个资源时,资源会发起一个跨域HTTP请求.
   应用场景: ①调用XMLHttpRequest或fetchAPI通过跨站点方式访问资源.
                  ②网络字体,例如Bootstrap(通过CSS使用@font-face跨域调用字体).
                  ③通过canvas标签,绘制图表和视频.
   一些相关流程: https://blog.csdn.net/u014344668/article/details/54948546
   主要隐患来自CSRF(跨站请求伪造): 客户登陆授信网站A,登录成功,生成Cookie,然后访问恶意网站B,B网站响应恶意代码,要求访问A,这时浏览器访问A,执行恶意代码.


2.CDN(内容分发网络):相关内容: https://www.zhihu.com/question/36514327?rf=37353035


3.HTTP的演变


4.HTTP消息:http://www.runoob.com/http/http-messages.html
是服务器和客户端之间交换数据的方式
类型: 请求--由客户端发送来触发一个服务器上的动作
响应--来自服务器的应答
具体: 客户端: 请求行,请求头,空行,请求数据
服务端: 状态行,消息报头,空行,响应正文


5.HTTP的会话:
①客户端建立一条TCP连接(如果传输层不是TCP,也可以是其他适合的连接)
②客户端发送请求并等待应答
③服务器处理请求并送达应答,回应


6. HTTP连接:
   ①短连接:没一个HTTP请求都由他自己独立的连接完成,每发起一个HTTP请求之前都会有一次TCP握手,而且是连续不断的
   ②长连接:keep-alive连接
   ③HTTP流水线: 在同一条长连接上发出连续的请求,而不用等待应答返回.

7. HTTP首部:
根据不同上下文,可将消息头分为:
一般头: 同时适用于请求和响应消息,但与最终消息主体中传输的数据无关的消息头。
请求头: 包含更多有关要获取的资源或客户端本身信息的消息头。
响应头: 包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
实体头: 包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。
端到端消息头:
这类消息头必须被传输到最终的消息接收者,也即,请求的服务器或响应的客户端,中间的代理服务器必须转发未经修改的端到端的消息头,并且必须缓存他们.
逐跳消息头:
这类消息仅对单次传输连接有意义,不能通过代理或缓存进行重新转发.


8. HTTP请求方法
GET: 请求一个指定资源的表示形式,使用GET的请求应该只被用于获取数据.
HEAD: 请求一个与GET请求的响应相同的响应,但没有响应体.
POST: 用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的1更改.
PUT: 用请求有效载荷替换目标资源的所有当前表示.
DELETE: 删除指定资源.
CONNECT: 建立一个到目标资源标识的服务器的隧道.
OPTIONS: OPTIONS方法用于描述目标资源的通信选项.
TRACE: 沿着到目标资源的路径执行一个消息环回测试.
PATCH: 用于对资源应用部分修改.


9. HTTP状态码: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status


10. CSP: Content-Security-Policy响应标头允许网站管理员控制允许用户代理为给定页面加载的资源.除少数例外,策略主要涉及指定服务器资源和脚本端点,这有助于防止跨站点脚本攻击(XSS)


11. CSP: 内容安全策略,是一个增加的安全层,可以帮助检测和缓解某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击.这些攻击用于从数据窃取到站点损坏到恶意软件的发布的所有内容.
   目的: 减轻跨站点脚本heel数据注入的攻击.
   XSS攻击: 利用浏览器对服务器接收的内容的信任,恶意脚本由受害者的浏览器执行.
   方式: CSP使服务器管理员可以通过指定浏览器应认为是可执行脚本的有效的域来减少或消除XSS可能发生的向量.然后CSP的浏览器将仅执行从那些列入白名单的域接收的源文件中加载的脚本,忽略其他脚本.

二. fluent python

1.  线程:一个线程就是执行一个子程序,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后A执行完毕,所有子程序调用是通过栈实现的,一个线程就是执行一个子程序.子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。


2.  协程:
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000


3.  python 教程:
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000


4. 协程
http://www.cnblogs.com/aylin/p/5601969.html
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;
协程的操作则是程序员
协程存在的意义: 对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续).协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序.
协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用协程.
event loop: 是协程执行的控制点,如果你希望执行协程,需要用到他们
event loop特征:
注册、执行、取消延时调用(异步函数)
创建用于通信的client和server协议(工具)
创建和别的程序通信的子进程和协议(工具)
把函数调用送入线程池中
python gevent协程: http://www.cnblogs.com/kaituorensheng/p/6111554.html
使用协程之前必须预激, 有一个装饰器.如果不预激,协程没什么用.

7. 把迭代器当做生成器使用,相当于把子生成器的定义体内联在yield from表达式中,此外,子生成器可以执行return语句,返回一个值,而返回的值会成为yield from表达式的值.


8. 假设yield from出现在委派生成器中.客户端代码驱动着委派生成器,而委派生成器驱动着子生成器.


9.仿真:


10. 协程显式自主地把控制权让步给中央调度程序.而多线程实现的是抢占式多任务.调度程序可以在任何时刻暂停线程(即使在执行一个恶语句的过程中),把控制权交给其他线程.

11. 期物是concurrent.futures模块和asyncio包的重要组件.


12.  GIL几乎对I/O密集型处理无害.cpython解释器本身就不是线程安全的,因此有全局解释锁(GIL),一次只允许使用一个线程执行python字节码.因此,一个python进程通常不能同时使用多个cpu核心.
python标准库中的所有阻塞型I/0函数都会释放GIL,允许其他线程运行.time.sleep()函数也会释放GIL,因此尽管有GIL, pyhton线程还是能在I/0密集型应用中发挥作用.


13. IO密集型: 读取文件,读取网络套接字频繁.
   计算密集型: 大量消耗cpu的数学与逻辑运算,也就是我们这里说的平行计算.


14. concurrent.futures模块,可以利用multiprocessing实现真正的平行计算.
   核心原理: concurrent.futures会以子进程的形式,平行的运行多个python解释器,从而令python程序可以利用多核CPU来提升执行速度.由于子进程与主解释器相分离,所以他们的全局解释器锁也是相互独立的.每个子进程都能够完整的使用一个cpu内核.

三. python web

1. pandas: 是一个结构化数据分析工具, 建立在numpy之上的
   pip install pandas
   数据结构: Series(一维数组), DataFrame(二维), Panel(三维)
2. Echarts

3.  安装 ipthon[notebook] :   pip install -U ipywidgets "ipython[notebook]"
     打开 notebook:  ipython notebook
     新建代码即可

 

4. 在linux下,使用free命令获取当前内存的使用情况: free -h
   如果主观上感觉系统运行缓慢,可以通过uptime命令获知当前系统的平均负载.
   szkj@szkj-ThinkPad-E470:~$ uptime
   13:57:17 up 3 days,  5:21,  1 user,  load average: 0.44, 0.42, 0.50
   后面三个数分别表示最近1分钟,最近5分钟和最近15分钟内进程队列中的平均进程数.进程数越多表示进程需要的等待的时间越长,系统越繁忙.如果这三个值都经常超过cpu个数,就说明cpu很繁忙.
获取CPU的个数: grep processor /proc/cpuinfo|wc -l


5.使用并发方式编程也是web开发者的一项必须掌握的日常技能.好的并发程序远比单线程单进程的程序的运行效率高的多.


6.为了抓取顺利,需要做好:
  ①使用代理
  ②伪造UA字符串
  ③选择解析html的方式: 解释器: BeautifulSoup; html.parser; lxml; html5lib

7. 讨论python程序的效率时,经常提到的弊端之一是全局解释所GIL.
   GIL限制任何时间都仅有一个线程在执行.但是存在即合理,由于线程是轻量级的,并且相互之间易于通信,GIL保护了所有全局的解释器和环境状态变量.
   如果不适用GIL,会带来包括死锁,争用条件和高复杂性的内的各种问题.


8. 使用GIL, 由于GIL的限制, 会对多线程有影响吗?
   ①python大部分是使用c语言编写的,一些标准库和第三方的模块也是用C编写的,而C语言代码是可以获取和释放GIL的,这在一定程度上缓解了GIL的问题.一些重要的,需要更高效率的模块还可以使用C语言编写,这样就可以利用更多的CPU资源.
   ②多线程适合解决由于网络,磁盘等资源造成的I/O阻塞问题,他利用了等待I/O请求完成被阻塞而导致的CPU空闲时间.计算密集型的工作不适合使用多线程完成.因为计算需要cpu资源,如果cpu资源繁忙的话,使用多线程并没有更多的利用cpu的空闲时间,反而由于cpu需要额外调度多线程,以及线程切换的各种开销,多线程的运行效率比单线程还要慢.


9. 在多线程中需要共享数据,如果数据共享时可能被修改,就需要加锁来保护她,以确保同一时刻只能有一个线程访问这个数据.这时可以使用Queue模块.Queue是线程安全的,易用它可以降低程序的复杂度,代码清晰,可读性强.


10. 高并发编程时,采用多线程(进程)不可取,原因?
    因为线程(进程)本质上都是操作系统的资源.每个线程都是需要额外占用内存的,由于线程的调度由操作系统完成,调度器会因为时间片用完等原因强制夺取某个线程的控制权,开发者还需要考虑加锁,使用队列等操作,这些都容易造成高并发情况下的性能瓶颈.这时就可以考虑?协程.


11. 协程:  协程是用户空间线程,复杂的逻辑和异步都要封装在底层

12. type, class 等都是python中的关键词, 如果需要重复使用, 需要在后面加一个_, 例如type_, class_

13. 使用多进程,可以有效避免GIL,因为每个进程都拥有自己的python解释器实例,也就不受GIL限制,计算密集型的任务通常应该使用多进程方式.

14. Future是python3.2引入的用于处理并发的模块,他提供一种优雅的用多线程或多进程实现并发的方式.是一种异步编程范式.无论是线程,网络,还是I/0,甚至RPC,只要是异步过程调用,都可以通过Future的概念统一处理


15. asyncio: 它提供了适用协程编写单线程并发代码,通过I/O多路复用访问套接字和其他资源,运行网络客户端和服务器等原语.而python3.5添加了async和await这两个关键字.自此协程成为了新语法,而不在是一种生成器类型了.I/O多路复用和协程的引入,可以极大提高高负载下的程序的I/0的性能.
https://www.cnblogs.com/zhaof/p/8490045.html


16. 需要对python中内置模块的了解
   ①functools模块包含了一些列操作其他函数的工具.
      partial: 可以重新定义函数签名,也就是在执行函数之前把一些参数预先传给函数,待执行时传入的参数数量就会减少.

eg:
def add(a, b):
    return a + b
from functools import partial
addone = partial(add, 1)
addone(1)
Out[33]: 2
add(1, 2)
Out[35]: 3
addone( 2)
Out[36]: 3


       wraps: 把被封装函数的__name__,__module__,__doc__和__dict__复制到封装函数中,这样在未来排错或者函数自省的时候能够获得正确的源函数的对应属性.

eg:
import functools
def deco2(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapper
@deco2
def func():
    "this is __doc__"
    return 1
func.__doc__
Out[51]: 'this is __doc__'
func.__name__
Out[52]: 'func'


   如果不加@functools.wraps, 会错误使用装饰器的对应属性,所以需要使用wraps拷贝源函数属性.
  ②collections
      Counter: 计数
     deque: 双端队列
     defultdict
     OrderedDict: python的dict结构是无序的:
     namedtuple:

17. python OS模块

   ①OS模块: 它是一个python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作.
import os
help(os)
   ②os模块的重要函数和变量
os.getcwd()获取当前路径,这个常用
os.listdir()列出当前目录下的所有文件和文件夹
os.remove()方法可以删除指定文件
os.mkdir('haha')创建一个名为haha的目录
os.rmdir('c')删除一个名为c的目录
os.rename('abc.txt', 'readme.txt')重命名一个文件
os.sep更改操作系统中的路径分隔符.
os.system()方法用来运行shell命令
os.chdir()改变当前目录,到指定目录中

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值