• selectors实现高并发


    1. 下面的例子,客户端给服务端发送消息,服务端把消息返回

    server

    #!/usr/bin/env python
    
    
    import selectors
    import socket
    import time
    import threading
    
    
    sel = selectors.DefaultSelector()
    
    def echo(conn,cmd,filename):
        time.sleep(3)
        conn.send((cmd + ' ' + filename).encode())
    
    def accept_client(sock,mask):
        conn,addr = sock.accept()
        print('conn:{},addr:{},mask:{}'.format(conn,addr,mask))
    #     conn.setblocking(False)
        sel.register(conn, selectors.EVENT_READ, read_client)
    
    def read_client(conn,mask):
        data = conn.recv(1024).decode().strip()
        if data:
            if len(data.split(' ')) == 2:
                cmd = data.split(' ')[0]
                filename = data.split(' ')[1]
                t = threading.Thread(target=echo,args=(conn,cmd,filename))   #这里使用了线程,不然程序会变成串行的,执行一个客户端任务,sleep(3)然后再执行下一个客户端任务...
                t.start()
    #             time.sleep(1)
    #             conn.send((cmd + ' ' + filename).encode())
            else:
                conn.send(('usage: put filename ;get filename').encode())
        else:
            print('{} closed'.format(conn))
            sel.unregister(conn)
            conn.close()
    server = socket.socket()
    server.bind(('localhost',1235))
    server.listen(12340)
    # server.setblocking(False)
    sel.register(server, selectors.EVENT_READ,accept_client)
    
    
    while True:
        events = sel.select()
        for key,mask in events:
            callable = key.data
            callable(key.fileobj,mask)

    client

    #!/usr/bin/env python
    
    import socket
    import threading
    import time
    
    ip_port = ('localhost',1235)
    socks = [socket.socket() for i in range(1000)]        
    
    m = b'get abc'
    time_list = []
    def run(s):
        s.connect(ip_port)
        s.send(m)
        data = s.recv(1024)
        print(s,data)
        
    start_time = time.time()   
    for s in socks:
        t = threading.Thread(target=run,args=(s,))
        t.start()
        time_list.append(t)
    for i in time_list:
        i.join()
    print('time:{}'.format(start_time - time.time()))
        

    2. 实现并发put和get文件

  • 相关阅读:
    切图常用快捷键
    统计网页访问量的代码
    jQuery $.each用法
    js数组去重的三种常用方法
    React中的context的用法和使用场景和发布-订阅模式
    工具函数
    前端安全
    面试题整理
    学习的一些链接
    工厂模式、构造函数模式、原型模式、构造函数模式+原型模式
  • 原文地址:https://www.cnblogs.com/fuckily/p/5924672.html
Copyright © 2020-2023  润新知