• 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")
    
  • 相关阅读:
    清除 Windows 系统垃圾的 bat
    java通过System.getProperty获取系统属性
    【转】Angular之constructor和ngOnInit差异及适用场景
    p中不能包含div
    How to make PostgreSQL functions atomic?
    How to chain a command after sudo su?
    javascript柯里化
    如何在Angular优雅编写HTTP请求
    angular default project (angular.json的解读)
    error:crosses initialization of ...的解决办法
  • 原文地址:https://www.cnblogs.com/aaron-shen/p/5659891.html
Copyright © 2020-2023  润新知