课堂笔记:
上周回顾:
socket:
1. 导入模块
2. 创建socket
3. send
sendall, sendall本质上也是调用send
但是在内部做了一个while循环,拿到消息,循环发,知道消息完全发送
sendall:
while True:
10 = send(‘adkflskjf023jlskdf‘)
10 = send(‘adkflskjf023jlskdf‘)
...
send,一次不一定能完全发送
10 = send(‘adkflskjf023jlskdf‘)
所以,以后使用,都应该使用sendall
Python 3中发送 的是 字节, Python2中发送的是 字符串
recv(2048) 最多接受2048
粘包:
ack确认
socketserver:
1. 自定义类
2. 继承方法
一. 上节作业:
二. 小知识点:
作用域
1. Python中没有块级作用域
Java/C# 不可以
Python/JavaScript 可以
if 1 == 1:
name = ‘alex‘
print(name)
for i in range(10):
name = i
print(name)
2. Python中以函数为作用域
3. 作用域链,找的时候,由内往外找,知道找不到报错
对于作用于来说,在函数没有执行之前,作用域已经全部确定了,作用域链也已经确定了。
三. Python2.7多继承, 回顾下Python3.5的多继承
Python3中所有的类都默认继承 object类
Python2.7中所有的类默认都不继承 object类
Python2.7中:
默认不支持 不继承object的类 叫经典类;
添加object的,继承object的类,叫新式类;
Python3中:
所有的都是新式类,也就是默认的都继承object类
四. socketserver源码, 下来找下源码
============== ***** =================
支持并发处理 socket
1. __init__ TCPServer, 调用 BaseServer 的构造方法
2. BaseServer
self.server_address = server_address 传入的元组, ip和端口
self.RequestHandlerClass = RequestHandlerClass 自己定义的类
self.__is_shut_down = threading.Event()
self.__shutdown_request = False
3. server.serve_forever() --》 BaseServer
4. self._handle_request_noblock() serve_forever() 中调用的!
5. self._handle_request_noblock 方法调用: self.process_request(request, client_address)
6. 从self.process_request(request, client_address) 方法调用:
self.finish_request(request, client_address)
self.shutdown_request(request)
7. self.finish_request(request, client_address)
self.RequestHandlerClass(request, client_address, self)
8. shutdown_request(self, request):
self.close_request(request)
五. I/O多路复用
能检测所有的IO操作,不单纯是socket, 但是文件操作除外
概述:
select ,poll , epoll
监听socket对象内部是否变化了?
什么时候变化?
连接或者收发消息的时候
select 系统内核底层维护了一个for循环,检测变化。在windows、linux平台都可以用,支持跨平台。有C10K问题,最大支持1024个
poll, 底层也是通过for循环实现。 但是没有个数限制了。但是for循环效率不高。
epoll,谁变化(回调函数),告诉epoll谁发生了变化。而
六. 多线程、多进程
概述:
Alex 甄嬛西游传
1. 一个应用程序可以有多进程、多线程
2. 默认是单进程、单线程
3. 单进程,多线程,在Python中不会性能提升,在Java和C#中可以提升。
提高并发:
多线程: IO操作,不会用到CPU,效率提升是可以的
多进程:计算型操作, 需要占用CPU,因此性能不会有提升
可以用 多进程
4. GIL,全局解释器锁的存在,导致的
创建线程知识点:
obj.setDaemon(False) #True, 表示主线程不等子线程
obj.join(num) #表示主线程到此等待。。。,直到子线程执行结束; num是指最多等待num秒
obj.start() #不代表当前县城内会被立即执行
博客,待续...