1.14~1.18学习笔记

1.  python的第三方库gevent相关内容

gevent运作原理: 它和select, poll, epoll等程I/O复用操作注册监听事件原理是一样的.监听多个I/O对象,当io对象有变化(有数据)的时候就通知用户.
(1)当用户进程调用了select,那么整个进程会被block;
(2)同时,内核会监听所有select负责的socket;
(3)当任何一个socket中的数据准备好了,select就会返回;
(4)这个时候用户进程再调用read操作,将数据从内核拷贝到用户进程.
怎么实现的呢?
gevent高效的封装了poll, epoll等I/O复用操作,是一个比较成熟的第三方库,是可以直接使用的.它里面也有一个socket,它封装了这个socket,具有高性能,主要是对socket.recv和socket.send封装成了一个event,所有的poll, epoll等I/O复用操作的注册读,写事件都是这样的,gevent也是这么实现的.
工作原理:
(1)事件的注册.注册他的读事件和写事件.注册它的读事件,需要判断它是socket连接的读数据操作,还是一个新的连接请求
(2)如果是新的连接请求,需要把这个新的连接请求的读事件注册到服务端I/O复用上去执行读操作
(3)它会监控这个读事件,读完之后,经过HTTP协议或其他的方式来解析这个数据,把处理完的数据返回给前端,此时,取消socket的读事件,改为写事件,然后把写事件时对应的数据写回给远端,就可以了,这样就做到一个完整的I/O复用的过程.所有的框架几乎都是按照这个流程走的,在一个while true循环中去调用它,然后进行读写操作.

gevent是第三方库,通过greenlet实现协程,对greenlet做了扩展,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。

2. 自增主键和uuid作为主键的区别么?
https://blog.csdn.net/qq_39454048/article/details/82378155
由于主键使用了聚簇索引,如果主键是自增id,,那么对应的数据一定也是相邻地存放在磁盘上的,写入性能比较高。如果是uuid的形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

3. uuid的五个算法
https://www.jianshu.com/p/93a1ad660590
概述: UUID是128位的全局唯一标识符,通常由32字节的字符串表示.它可以保证时间和空间的唯一性,也称为GUID.
     它通过MAC地址,时间戳,命名空间,随机数,伪随机数来保证生成ID的唯一性.
算法: UUID主要有五个算法,也就是五种方法来实现
①uuid1(): 基于时间戳,由MAC地址,当前时间戳,随机数生成.可以保证全球唯一性,但是MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC.
②uuid2(): 基于分布式计算环境DCE(python中没有这个函数)算法与uuid1相同,不同的是把时间戳的前四位位置换为POSIX的ID.实际上很少用到该方法.
③uuid3(): 基于名字的MD5散列值,通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid.
④uuid4(): 基于随机数,有伪随机数得到,有一定的重复概率,该概率可以计算出来.
⑤uuid5(): 基于名字的SHA-1散列值算法与uuid3相同,不同的是使用Secure Hash Algorithm 1 (安全散列算法)
使用: 首先,python中没有基于DCE的,所以uuid2可以忽略;其次,uuid4存在概率性重复,由无映射性,最好不用;再次,若在Global的分布式计算环境下,最好用uuid1;最后,若有名字的唯一性要求,最好用uuid3或uuid5.
eg:
 

import uuid
print(uuid.uuid1())
8a5cd7da-1ae8-11e9-b3bb-8c164550464e
print(uuid.uuid3(uuid.NAMESPACE_DNS,'textname'))
0d51f784-b309-386c-999a-92c2edff35d3
print(uuid.uuid4())
688e208b-6953-427f-871c-d7db38abdfd8
print(uuid.uuid5(uuid.NAMESPACE_DNS,'textname'))
f7f0ba32-929d-541b-9395-478cb51644e2

4. rpc原理
http://blog.jobbole.com/92290/
这篇博客,着重原理, 代码少些,可以仔细阅读, 掌握原理也是必做的.

5.协议是什么?
协议就是发送流上的一个解析数据的东西,几乎所有的协议的底层都是socket.send操作, 不过send的是什么, 需看协议规范而定, 看需要传什么参数或参数的顺序是什么等等.

6.go语言的优势,特点
go语言是静态语言,一次编译,到处执行,更多关注的是性能,在语言层面上实现高并发
go语言模式: 一个核对应一个进程, 一个进程对应一个线程, 一个线程实现多个协程
go语言本质: 还是和select, poll, epoll等I/O复用操作原理一样的.但是它对硬件是没有一点关系的,它是在语言层面上调度的.
应用场景: web开发等, 它不需要向python一样, 用nginx, uwsgi等部署操作, 但是守护进程还是需要的.

7.python代码执行原理,执行时python虚拟机是什么?
https://www.restran.net/2015/10/22/how-python-code-run/
python虚拟机就是一个功能,但并不独立,是在代码层面上实现的, 其实就是一个for循环.
假设现在有一个demo.py文件, 我们要运行这个文件, 即执行python demo.py,之后,将会启动python解释器,然后将demo.py文件编译成一个字节码对象PyCodeObject.
(一个小问题: 编译的结果为什么不是个pyc文件(一个py文件经过编译后生成的二进制文件), 为什么是一个对象?
在python的世界里,一切都是对象,函数也是对象,类型也是对象,类也是对象,甚至编译出来的字节码也是对象,
.pyc文件是字节码对象(PyCodeObject)在硬盘上存在的表现形式
)
在运行期间,编译结果也就是 PyCodeObject 对象,只会存在于内存中,而当这个模块的 Python 代码执行完后,就会将编译结果保存到了 pyc 文件中,这样下次就不用编译,直接加载到内存中。pyc 文件只是 PyCodeObject 对象在硬盘上的表现形式。
虚拟机的作用到了,demo.py文件被编译后,接下来的工作就交由python虚拟机来执行字节码指令了.python虚拟机会从编译得到的PyCodeObject对象中一次读入每一条字节码指令,并在当前的上下文环境中执行字节码指令.我们的程序就是通过这样循环往复的过程才得以执行.

8. python起一个进程就是一个解释器

9. python的内省是什么
https://blog.csdn.net/slowlight93/article/details/50659582
在计算机科学中,内省指一种能力,可以确定对象是什么,包含何种信息,可以做什么
比如 dir(), getattr()等

10. oauth2协议是不是大部分第三方登录,第三方认证的基石,他具体是怎样规定的?
http://www.cnblogs.com/neutra/archive/2012/07/26/2609300.html
oauth2协议流程, 就是一个令牌之间的传输,与微信openid概念差不多.

11. markdown编辑器 基本用法
https://www.jianshu.com/p/191d1e21f7ed


 

猜你喜欢

转载自blog.csdn.net/liugaigai427/article/details/86527917