python之day10(socketserver)

Day10

上节回顾:      

 socket
            1 导入模块
            2 创建socket
            3
                字节
                send    sendall
                10字节 = send("alex123123deqasdsa")
                sendall:        #会源源不断的发送完
                    while True:
                        10字节 = send("alex123123deqasdsa")
                        10字节 = send("alex123123deqasdsa")
                        10字节 = send("alex123123deqasdsa")
                recv(2048)        #最多接收2048字节
        粘包:ack
        socketserver
            
            1 自定义类
            2 继承类
            3 handle方法
            4 socketserver == 调用自定义类
            5 运行 forever

上节作业


    1 socket 发送字符串
    2 socket发送文件
        客户端:
            文件大小
            发消息
            
        服务器端:
            接收消息(根据文件大小)
            
        客户端:
            json ->用户 密码
            字符串
        服务端:
            用户验证
            接受,subprocess > win > gbk编码的字节
            上传文件(大小)
            发消息

作业问题:
    断点续传
        文件:
            a 追加
            w 清空写
        文件指针:
            seek(num)

小知识点:


    作用域:
    python中无块级作用域
        java/c#        不可
        python/javascript    可以
        if 1==1:
            name = "alex"
        print(name)

if 1 == 1 :
    name = "alex"
print(name)

def func():
    name1 = "alex"
func()
print(name1)
name = "alex"

def f1():
    print(name)

def f2():
    name = "eric"
    return f1

ret = f2()
ret()


    python以函数作为一个作用域


    python 作用域链,由内向外找。,直到找不到报错。
    对于作用域来说,在函数为执行之前,作用域和作用域链都已经确定了
    li = [lambda :x for x in range(10)]
    print(li)
    #函数在没有执行前 ,内部代码不执行。
    li = [lambda :x for x in range(10)]
    print(li)
    print(li[0]())    
    #函数在没有执行前 ,内部代码不执行。
    9

li = [x for x in range(10)]
print(li)


li = [lambda :x for x in range(10)]
print(li)
print(li[0]())
# #函数在没有执行前 ,内部代码不执行。
li = []

for i in range(10):
    def f1():
        return i
    li.append(f1)

li[0]()

py27多继承 py35多继承


py35都继承object 27中的新式类


socketserver源码***
    ****支持并发处理socket****


    

IO多路复用:


    概述:
        select,poll,epoll
    select 个数限制 1024
    poll 无个数限制 不能跨平台
    epoll 谁变化了 主动告诉epoll
    监听socket对象内部是否变化了?
    什么时候变化?连接或收发消息
    服务器端的socket对象发生变化?就有新链接来了
    sk:有新连接来了。。。
    conn:要收"发"消息了
    
    IO多路复用 == 监听socket对象内部是否变化了?
    win--select
    rlist,w,e = select.select([sk,],[],[],1)  1是超时时间 1s
    #rlist中socket对象列表
    #sk有变化 rlist=[sk,]
    #sk无变化 rlist= []
    
    for r in rlist:
        conn, address = r.accept()
        conn,sendall(byte("hello"))
        
    实现读写分离

 1 #!/usr/bin/env  python
 2 # -*- coding: UTF-8 -*-
 3 # Author: Aaron Shen
 4 
 5 import socket
 6 import select
 7 
 8 sk = socket.socket()
 9 sk.bind(("127.0.0.1", 9999))
10 sk.listen(5)
11 
12 inputs = [sk, ]
13 outputs = []
14 message = {}
15 
16 while True:
17     rlist, wlist, e, = select.select(inputs, outputs, [], 1)
18     print(len(inputs), len(rlist), len(wlist), len(outputs))
19 
20     for r in rlist:
21         if r == sk:
22 
23             print(r)
24             conn,addr = r.accept()
25             inputs.append(conn)
26             message[conn] = []
27             conn.sendall(bytes("hello",encoding="utf-8"))
28 
29         else:
30             # r.recv(1024)
31             print("==========")
32             try:
33                 ret = r.recv(1024)
34                 if not ret:
35                     raise Exception ("断开连接")
36                 else:
37                     outputs.append(r)
38                     message[r].append(ret)
39             except Exception as e:
40                 inputs.remove(r)
41                 del message[r]
42 
43     for w in wlist:
44         msg = message[w].pop()
45         rspe = msg + bytes("response", encoding="utf-8")
46         w.sendall(rspe)
47         outputs.remove(w)
test_erver
 1 #!/usr/bin/env  python
 2 # -*- coding: UTF-8 -*-
 3 # Author: Aaron Shen
 4 
 5 import socket
 6 sk = socket.socket()
 7 sk.connect(("127.0.0.1",9999))
 8 
 9 date = sk.recv(1024)
10 print(date)
11 
12 while True:
13     inp = input(">>>")
14     sk.sendall(bytes(inp,encoding="utf-8"))
15     print(sk.recv(1024))
16 
17 sk.close()
test_client

多线程,多进程,协程    

  概述:
        
    Alex甄嬛西游传
    
    1  一个应用程序,可以有多进程和多线程,默认是单进程,单线程
    2 默认:单进程,单线程。
    3 单进程,多线程
    
        多线程: IO操作 -- 不占用cpu  可以提高并发
                        多线程提高并发
                计算性操作,需要占用cpu ,无法提高并发
                        多进程提高并发
    4 GIL 全局解释器锁
    ====
        多线程,多进程 提供并发
        IO密集型:多线程
        计算密集型 多进程提高并发    
            PS IO操作 不占用cpu  GIL 全局解释器
            
如何创建线程
def f1(arg):
    print(arg)
    
#for i in range(10):

import threading

t = threading.Thread(target=f1, args=(123, ))  #子线程
t.setDaemon(True)  #true 表示主线程不等此子线程 默认是False
t.start()    #不代表当前线程会被立即执行。
t.join(2)    #主线程停止,等待子线程执行完在执行
            #参数2 表示主线程最多等待2秒
f1(111)
print("end")

def f1(arg):
	print(arg)

#for i in range(10):

import threading

t = threading.Thread(target=f1, args=(123, ))  #子线程
t.setDaemon(True)  #true 表示主线程不等此子线程
t.start()	#不代表当前线程会被立即执行。
t.join(2)	#主线程停止,等待子线程执行完在执行
			#参数2 表示主线程最多等待2秒
f1(111)
print("end")
原文地址:https://www.cnblogs.com/aaron-shen/p/5659891.html