断点续传

 

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()
name="alex"
def f1():
print(name)

def f2():
name="aric"
return f1
ret=f2()
ret()

解析: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]())

其实这个面试题就是下面的程序:

li=[]
for x in range(10):
def f1():
return x
    li.append(f1)
print(li[0]())
print(li[1]())

9


多继承:

3:从左往右,深度优先,最后找祖宗       默认所有类都继承object类

2:从左往右,深度优先,一条道走到黑,如果继承object类的话就同3啦

在2中 不继承object类的话叫经典类

          继承object类的话新式类,3中的类全是新式类

 



多路复用:

python处理es数据写入hive_多路复用

中间的圈是多路复用,可看做是大堂经理

IO多路复用:监听socket对象内部是否变化

中间看视频

 

select方式是通过for循环来实现的,所以效率低,但是跨平台,还有个缺点是有限制?

poll方式是通过for循环来实现的,没有限制

epoll方式是通过socket对象有变化的话自己告诉epoll的方式实现的  nginx用的是epoll

 

IO多路复用不只是针对socket操作的,支持所有的IO操作

 


socketserver源码

 


多线程,多进程

1. 一个应用程序可以有多进程,多线程,默认是单进程,单线程

2.单进程,多线程

    py多线程:IO操作          不占用cpu    能提高并发 

                    计算性操作     占用cpu        不能提高并发(GIL)  所以要用多进程

3.GIL 全局解释器锁