看某一个端口的使用情况
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): def thirdFloor(): print('原函数开始执行') func() print('原函数执行完毕了') return thirdFloor
def origin(): print('这里正在执行原函数')
@seconFloor def origin(): print('这里正在执行原函数') if __name__ == "__main__": sf = secondFloor(origin) sf() origin() 以上两个是等价的 ------------------------------------------------------------- 以上为不带参数的函数进行装饰
def secondFloor(func): def thirdFloor(args): print('原函数开始执行') func(args) print('原函数执行完毕了') return thirdFloor
@secondFloor def origin(info): print(info)
|


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()
|