zoukankan      html  css  js  c++  java
  • 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文件

  • 相关阅读:
    SQLServer2012数据库降级至SQLServer2008R2的方法
    男程序猿和女程序猿的网恋—相见(二)
    收藏关于AI的相关的文章
    JAVA提高九:集合体系
    JAVA提高八:动态代理技术
    JAVA提高七:类加载器
    JAVA提高六:泛型
    JAVA提高五:注解Annotation
    JAVA提高四:反射基本应用
    JAVA提高三:反射总结
  • 原文地址:https://www.cnblogs.com/fuckily/p/5924672.html
Copyright © 2011-2022 走看看