python 基于 gevent 完成C/S 服务器协程多并发案例

gevent 解决单线程内并发
如果再配合多线程,那么可以优化更进一步优化扛住高并发

服务器


from gevent import monkey, spawn; monkey.patch_all()  # 使用gevent必须 调用  
import socket                                                          

def communicate(conn):                                                 
    while True:                                                        
        try:                                                           
            data = conn.recv(1024)                                     
            if not data:break                                          
            conn.send(data.upper())                                    
        except ConnectionResetError:                                   
            break                                                      
    conn.close()                                                       


def server(ip, port):                                                  
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)            
    soc.bind((ip,port))                                                
    soc.listen(5)                                                      
    while True:                                                        
        conn, der = soc.accept()                                       
        spawn(communicate, conn)  # 协程开启处理IO问题                         
    soc.close()                                                        

if __name__ == '__main__':                                             
    g = spawn(server, '127.0.0.1', 8080)  # 开启协程, 异步提交                 
    g.join()                                                                                            

客户端


import socket
from threading import Thread,currentThread

def client():
    soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    soc.connect(('127.0.0.1', 8080))

    while True:
        soc.send(('%s hello' % currentThread().getName()).encode('utf-8'))
        data = soc.recv(1024)
        print(data.decode('utf-8'))

    soc.close()

if __name__ == '__main__':
    for i in range(500):  # 模拟500个 用户交互
        t = Thread(target=client)  # 线程开启
        t.start()                                                         

猜你喜欢

转载自blog.csdn.net/weixin_42329277/article/details/80752628