断点续传
python2.7 多继承 py35多继承
socketserver源码
支持并发处理socket
i/o多路复用
上节回顾
socket
1.导入模块
2.创建socket
3. send 不一定全部发送完成 会有个返回值:发送多少字节
sendall 内部调用send 会把数据全部发送完成
粘包:ack
socketserver
1.自定义类
2.必须继承某个类
3.重写handle方法
4.调用socketserver构建对象
5.forever运行
上节作业:
断点续传:
文件:
a,追加 续传
w,清空 重新上传
文件指针:
seek(num)
文件名存在:以前上传过 服务端以a模式打开此文件
获取字节大小num发给客户端
客户端用seek(num)跳到续传点再发送
小知识点:
作用域:python中无块级作用域
java/c# 有块级作用域
python/js 无块级作用域
if 1 == 1:
name="alex"
print(name)
输出:alex
python中是以“函数”为作用域的
作用域是由内往外的
在函数未执行前作用域已全部确定啦,作用域链已经生成
name="alex"
def f1():
print(name) def f2():
name="aric"
f1()
f2()
alex
name="alex"
def f1():
print(name) def f2():
name="aric"
return f1
ret=f2()
ret()
alex
解析:f1的作用域是自己函数内和全局
f2的作用域是自己函数内和全局
所以执行f1的时候先在函数f1里找,没有的话就找全局变量
新浪面试题:
li=[lambda :x for x in range(10)]
print(li[0]())
解析:先看下的例子:
li=[x for x in range(10)]
print(li)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
li:列表
for前面(x)是列表中的元素,x的取值是for循环取值的
再看前面的面试题:
li的元素是lambda :x,就是一个一个的函数,函数在调用之前是不执行的,所以在li[0]()之前lambda :x是不执行的,但是for x in range(10)一直在执行,最后值是9,li[0]()时lambda :x执行,:后面是lambda函数的返回值,这时的x是9,所以
print(li[0]())
执行结果是9
其实这个面试题就是下面的程序:
li=[]
for x in range(10):
def f1():
return x
li.append(f1)
print(li[0]())
print(li[1]())
9
9
多继承:
3:从左往右,深度优先,最后找祖宗 默认所有类都继承object类
2:从左往右,深度优先,一条道走到黑,如果继承object类的话就同3啦
在2中 不继承object类的话叫经典类
继承object类的话新式类,3中的类全是新式类
多路复用:
中间的圈是多路复用,可看做是大堂经理
IO多路复用:监听socket对象内部是否变化
中间看视频
select方式是通过for循环来实现的,所以效率低,但是跨平台,还有个缺点是有限制?
poll方式是通过for循环来实现的,没有限制
epoll方式是通过socket对象有变化的话自己告诉epoll的方式实现的 nginx用的是epoll
IO多路复用不只是针对socket操作的,支持所有的IO操作
socketserver源码
多线程,多进程
1. 一个应用程序可以有多进程,多线程,默认是单进程,单线程
2.单进程,多线程
py多线程:IO操作 不占用cpu 能提高并发
计算性操作 占用cpu 不能提高并发(GIL) 所以要用多进程
3.GIL 全局解释器锁