SDUTACM 2019-12-09
''' - 什么是协程? 协程有别于【多线程】、【多进程】,协程是指单线程实现并发的效果。一个线程里总是会存在I/O操作,此时操作系统检测到会自动将cpu执行权限分配给其他线程。 而协程就是在一个线程里运行多个’子线程’,当其中的‘子线程’处于阻塞状态时会自动切换到另外一个‘子线程’。这样在CPU看来,我们这个程序就是一直处在运行的状态。 - 为什么要使用协程? 协程可以节约内存,提高程序的运行效率。 - 如何使用协程? 使用gevent模块,spawn,monkey。 monkey.patch_all() 猴子补丁,将监测所有I/O操作 '''
# 利用协程实现TCP服务端并发 from gevent import monkey, spawn;monkey.patch_all() from threading import current_thread from socket import * def communicate(conn): print(f'子线程:{current_thread().getName()}') while True: try: data = conn.recv(1024) print(data) conn.send(data.upper()) except: break conn.close() def server(ip, port): server = socket(AF_INET, SOCK_STREAM) server.bind((ip, port)) server.listen(5) while True: conn, addr = server.accept() print(f'{addr}连接.....') spawn(communicate, conn) g.start() if __name__ == '__main__': g = spawn(server, '127.0.0.1', 9999) g.join()
# 客户端 from socket import * from threading import Thread,current_thread def run(): client = socket(AF_INET, SOCK_STREAM) client.connect( ('127.0.0.1', 9999) ) while True: client.send(f"hello i'm {current_thread().getName()}".encode('utf-8')) data = client.recv(1024) print(data.decode('utf-8')) if __name__ == '__main__': t_list = [] for i in range(500): t = Thread(target=run, ) t.start()