当前位置: 首页 > news >正文

多线程和网络总结

近期Python网络编程与多线程/多进程学习复盘

一、核心知识收获

1. 多线程与多进程编程

  • 多线程应用:实现图片下载(DownloadHanlder类继承Thread,重写run方法处理下载逻辑),利用线程并行处理网络IO任务,提高下载效率。
  • 多进程应用:拆分1亿元素大列表进行并行求和(Process类创建子进程,Queue实现进程间数据通信),理解“分而治之”思想在CPU密集型任务中的优势。
  • 关键区别:多线程适合IO密集型任务(如网络请求、文件读写),多进程适合CPU密集型任务(如大量计算);进程间需通过Queue等工具通信,线程可共享内存但需注意锁(threading.Lock)的使用。

2. TCP网络编程

  • 服务器端开发
    • 套接字(socket)创建:指定AF_INET(IPv4)和SOCK_STREAM(TCP),通过bind绑定IP与端口、listen监听连接、accept阻塞等待客户端连接。
    • 多线程处理客户端:每个客户端连接对应一个线程(如FileTransferHandler),避免单线程阻塞,支持多客户端同时访问。
    • 数据传输:需将数据编码为字节流(encode('utf-8')),二进制文件(如图片)需通过base64编码转为文本格式,结合JSON实现结构化数据传输。
  • 客户端连接
    • 工具连接:掌握CMD/PowerShell中通过Telnet(需启用Windows功能)、PowerShell原生命令(New-Object System.Net.Sockets.TCPClient)连接服务器的方法。
    • 自定义客户端:用socketconnect方法连接服务器,recv接收数据,实现与服务器的交互。

3. 数据处理与常见模块

  • 列表操作:理解列表切片(list[start:end])的“左闭右开”原则,用于多进程数据分片;认识到大列表(如1亿元素)创建的内存占用问题,学会用range(按需生成元素)优化。
  • 模块使用
    • requests:发送HTTP请求获取API数据(如美女图片API、体重秤接口),解析JSON响应(resp.json())。
    • jsondumps将字典转为JSON字符串(用于网络传输),loads解析JSON字符串。
    • base64b64encode/b64decode实现二进制数据与文本的转换,解决JSON无法传输二进制的问题。
    • time/datetimetime()计算程序执行时间,datetime.now()获取当前时间用于服务器数据返回。

二、典型疑问与解决方案

疑问类型 具体问题 解决方案
函数/方法参数问题 1. task_handler()缺少curr_listresult_queue参数
2. socket.bind()参数错误
1. 调用时传入所有必需参数,多进程中通过args传递元组参数
2. bind需传入(IP, 端口)格式的元组
数据结构错误 1. KeyError: 'newslist'(API返回无该字段)
2. TypeError: string indices must be integers
1. 打印API完整返回数据,确认字段名;检查APIKey有效性
2. 确认循环变量类型(如是否为字典),修正索引方式
网络连接问题 1. WinError 10049(绑定无效IP)
2. telnet/nc命令不可用
1. 绑定0.0.0.0(所有可用IP)或本机真实IP(ipconfig查看)
2. 启用Telnet客户端,或用PowerShell原生命令连接
多线程/进程逻辑问题 1. 计时不准确(漏算数据准备时间)
2. 进程间数据共享失败
1. 将start = time()移到程序最开始,统计全程耗时
2. 用multiprocessing.Queue实现进程间数据传递

三、易错点与改进方向

1. 高频易错点

  • 参数格式:忽略bind的元组参数格式、args的元组传递(如少加逗号)、函数调用时参数数量不匹配。
  • 数据类型判断:未提前打印API返回数据结构,想当然使用字段名;混淆字符串与字典的索引方式。
  • 资源释放与效率:多进程/线程未正确关闭连接(如client.close());大列表重复创建导致内存浪费,未用range优化。
  • 环境配置:忽略Windows系统默认未启用Telnet,直接使用telnet命令导致报错。

2. 后续改进方向

  • 代码健壮性:增加异常处理(如try-except捕获网络请求错误、文件读写错误),避免程序崩溃。
  • 性能优化
    • 多线程下载时设置线程池(concurrent.futures.ThreadPoolExecutor),避免创建过多线程。
    • 大文件传输时拆分数据(如分块发送),避免单次发送数据过大导致阻塞。
  • 功能扩展:基于现有TCP服务器,实现客户端向服务器上传文件、服务器对客户端身份验证等功能,深化网络编程理解。
  • 调试能力:遇到问题时先打印关键数据(如变量类型、API返回、IP/端口配置),逐步定位问题,减少盲目修改代码。
http://www.hskmm.com/?act=detail&tid=26289

相关文章:

  • 8.RV1126-OPENCV 视频中添加LOGO - 指南
  • 学习记录:响应式系统、文件通知与游戏输入机制的异同
  • oppoR9m刷Linux系统: 制作 scatter.txt 和 导出手机preloader
  • 详细介绍:ASR技术(自动语音识别)深度解析
  • 1.1 采样问题 Sampling and Bandits
  • 10.7 NOIP 模拟赛 T2. 中心极限定理
  • 【题解】10.6 国庆中秋 提高组 热身赛
  • UCB-CS70_离散数学_个人笔记:至少和至多 - Zeeh
  • 几个重要的偏微分方程
  • 虚拟机器人学习自然语言指令技术解析
  • 题解:换乘旅行
  • 2025企业级AI数据防泄漏指南:精准选型与核心指标全景透视
  • 感觉你是那种
  • 鲜花:不会说明你有抑郁症1
  • 【比赛记录】2025CSP-S模拟赛59
  • 使用 C 语言实现英文数字验证码识别系统
  • APlayer的配置方法和相关资料整理(已完成)
  • 详细介绍:目标检测任务的评估指标mAP50和mAP50-95
  • 一些有一定趣味性的杂题
  • 用 Haskell 实现英文数字验证码识别
  • 深入解析:Day43 Python打卡训练营
  • 用 Perl 实现验证码图像识别
  • 实用指南:【结构型模式】代理模式
  • cnblog Test
  • 云数据仓库十年架构演进与技术突破
  • 20251007 模拟测 总结
  • 2025国庆Day6
  • Claude 封杀中国后,我终于找到了平替!
  • [退役感言]You are my only one.
  • Mortal