Python流处理:如何更快地向服务器发送数据
如何提升TCP连接发送字符串的速度?
你的核心问题出在每次发送单个字符串就新建并关闭TCP连接——TCP连接的建立(三次握手)和关闭(四次挥手)本身就需要客户端与服务器交换多个数据包,这个过程的延迟累加起来,直接导致了每2秒才能发送一个字符串的低效表现。
问题根源
当前代码逻辑是:每次accept()拿到新连接后,只发送一条数据就立刻close(),完全没有利用TCP连接可以持续传输数据的特性。重复的连接建立/关闭操作,是速度慢的罪魁祸首。
优化方案
最直接有效的优化是保持连接打开,在同一个连接内持续发送数据,直到传输任务结束或客户端主动断开。如果场景允许,还可以配合批量发送进一步提升效率。
修改后的服务器端代码
import random import linecache import time # 可选,用于控制发送频率 # 假设s是你已经初始化好的socket对象 while True: conn, addr = s.accept() print(f"已与 {addr} 建立连接") try: # 保持连接,持续发送数据 while True: # 生成行号(可选:用集合去重避免重复发送同一行) line_number = random.randint(1, 2261074) # sent_lines = set() # 提前初始化集合 # while line_number in sent_lines: # line_number = random.randint(1, 2261074) # sent_lines.add(line_number) line = linecache.getline(filename, line_number) sendit = line.split(" ")[1] print(type(sendit)) print(f"正在发送: {sendit}") # Python3需注意:字符串要编码为字节流发送 # conn.send(sendit.encode('utf-8')) conn.send(sendit) # 可选:添加微小延迟,避免发送速率过高 # time.sleep(0.001) except BrokenPipeError: print(f"与 {addr} 的连接已断开") finally: conn.close() print('数据流传输结束。')
配套说明
- 客户端同步调整:客户端需要建立一次连接后持续接收数据,不能每次接收都重新发起连接,否则服务器端的优化无法生效。
- Python3编码处理:如果使用Python3,字符串必须编码为字节流(比如
utf-8)才能通过socket发送,否则会抛出类型错误。 - 去重优化:如果需要避免重复发送同一行,用集合记录已发送行号的效率远高于列表,集合的查找操作是O(1)复杂度。
- 速率控制:如果发送速度过快导致客户端处理不过来,可以通过
time.sleep()微调发送频率,数值根据实际场景调整。
内容的提问来源于stack exchange,提问作者osman tamer
相关产品推荐
相关产品推荐

