本文共 1829 字,大约阅读时间需要 6 分钟。
在服务端,我们使用gevent库来实现非阻塞的TCP服务器。这种方法能够显著提升服务器的吞吐量,特别是在处理大量并发连接时。gevent通过 monkey.patch_all() 将socket模块的关键函数改为非阻塞模式,这使得服务器可以在不等待客户端连接的情况下继续处理其他请求。
import geventfrom gevent import socketmonkey.patch_all()def server(port): s = socket.socket() s.bind(("127.0.0.1", port)) s.listen(2000) while True: client, addr = s.accept() gevent.spawn(handle_request, client) def handle_request(s): try: while True: data = s.recv(1024) print("收到的信息:{}".format(data.decode("utf-8"))) if not data: s.shutdown(socket.SHUT_WR) except Exception as e: print("异常:{}".format(e)) finally: s.close() 在客户端,我们通过多线程和多进程的方式同时建立多个连接。两种方法各有优劣,需要根据实际需求选择。
import socketimport threadingip_addr = ("127.0.0.1", 8000)c = socket.socket()c.connect(ip_addr)def handle_client(n): while True: data = str(n) c.send(data.encode("utf-8")) received = c.recv(1024) print("服务器回复:{}".format(received.decode("utf-8"))) c.close()if __name__ == "__main__": for i in range(500): thread = threading.Thread(target=handle_client, args=(i,)) thread.start() import socketimport multiprocessingip_addr = ("127.0.0.1", 8000)c = socket.socket()c.connect(ip_addr)def handle_client(n): while True: data = str(n) c.send(data.encode("utf-8")) received = c.recv(1024) print("服务器回复:{}".format(received.decode("utf-8"))) c.close()if __name__ == "__main__": for i in range(100): p = multiprocessing.Process(target=handle_client, args=(i,)) p.start() 在实际应用中,选择哪种方式取决于任务的负载要求和系统资源情况。
转载地址:http://bhofk.baihongyu.com/