看某一个端口的使用情况

netstat -anp | grep 8000

进程数比cpu数要多的话,上下文切换比较频繁

GIL锁,全局解释器锁,同个进程的多个线程,不能运行在不同的核上, 但是java和c++可以,python很少使用多线程

go可以多线程

非阻塞是select.setblocking()

多端口复用是select.setsockopt?

非阻塞编程的理解

当服务器端没有设置非阻塞时, 有可能出现:当一个客户端连接了服务器,但是没有对服务器发出任何的请求。此时,如果另一个客户端,来对服务器进行请求的话,则无法对该客户端进行响应。

就需要设置非阻塞是select.setblocking(False)

非阻塞编程比较简单,缺点就是当所有的浏览器的时候,也会用cpu

epoll原理就是:一旦有请求了,内核就会告诉我们

epoll主要监控长连接

python常用多进程多协程

动态网页:是从数据库加载内容,显示在自己页面上的

请求头就是一个个的键值对,可以变为字典对象

把字符串变成字典—-> eval(f.read())

http协议的header和body区分:通过一个\r\n的空行来进行区分

re.sub()是替换

用装饰器实现路由

闭包与装饰器

闭包

1
2
3
4
5
6
7
8
def SecondFloor():
msg = 'woshi diyicengbianliang'
def ThirdFloor():
print(msg)
return ThirdFloor
在这里面 如果return的函数是有()括号的话就表明是立即执行,如果是没有括号的话就是不立即执行
还有就是在闭包当中寻找变量的机制是:
从最下面一个函数,依次向上面查找,直到找到了最近的变量为止

装饰器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 先写一个装饰器
def secondFloor(func):
# 其实func相当于已经传到这个位置了
def thirdFloor():
print('原函数开始执行')
func()
print('原函数执行完毕了')
return thirdFloor


# 最原始的装饰器用法
def origin():
print('这里正在执行原函数')

@seconFloor
def origin():
print('这里正在执行原函数')

if __name__ == "__main__":
# 最原始的装饰器用法
sf = secondFloor(origin)
sf()

# 采用python语法的装饰用法
origin()

以上两个是等价的
-------------------------------------------------------------
以上为不带参数的函数进行装饰
# 带参数函数的装饰器
def secondFloor(func):
# 参数为args
def thirdFloor(args):
print('原函数开始执行')
func(args)
print('原函数执行完毕了')
return thirdFloor

@secondFloor
def origin(info):
print(info)


image-20200925201235657

image-20200925201650524

python 的回调函数:就是在一个函数的形参当中要传入一个函数, 在传实参的时候直接传入一个已经存在的函数的名字,回调函数就是等一会儿调用的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def callback_function(x, y, func):
return func(x) + func(y)

def fun_a(x):
return x + 10

def fun_b(x):
return x - 5


def main():
a = 1
b = 2
print(fun_a(a), fun_a(b))
res = callback_function(a, b, fun_a)
print(res)

main()


1
2
3
结果为:
11 12
23