最近写了p2p的文件传输软件,300M的文件只需1.5秒左右即可完成传输。期间遇到了一些问题,这里总结一下开发心得。
1、多线程编程调用消息发送队列时,需要加锁,保证整块数据内部不会插入其它数据。参考之前的文章:socket send recv使用心得。再向发送队列添加数据时,需要容错处理,因为取队列的速度可能会低于加的速度导致加失败。
2、接收线程在处理数据时,需要根据数据头分块处理,每次recv(buff)获取的未必是一包可处理的处理,可能是半包或者超过一包。
3、根据要传送的文件大小,动态修改发送和接收的buff。通过global关键字无法修改跨文件的关键字buff,这里通过‘文件名.函数’来修改跨文件的全局变量。recv中的buff影响了发送和接收的速度。buff越大,文件传送越快。发送端的buff对传输速度的影响更大。
这个并不是线性增长,后面优化了发送和接收的内存拷贝,无论buff改为64k还是2048k,传输速度稳定在2秒左右。但如果改成16k或者1k,时间分别为3.5秒和40秒左右。
4、自定义的CLV格式中的L的长度不够,开始只定义了8位,例如100M的文件字节长度都达到了9位,所以发送失败。
5、大文件,开始传送270M会引起pycharm memory error。接收方有大内存搬移操作,接收300M的数据,内存耗用在600M左右。
优化前:将接收的数据解析到一个字典里,key就是cmd,payload就是value,这样可以一次解析多个cmd。
优化后:一次处理一个cmd,
p2p双向传输300M的文件 开发心得(Python windows)
最新推荐文章于 2024-08-19 04:02:37 发布
分享了使用Python实现P2P文件传输的经验,涉及多线程同步、数据分块处理、缓冲区大小调整、内存管理等方面。通过优化,300M文件能在1.5秒内完成传输。文中提到了内存拷贝、接收线程内存占用优化等关键点。
摘要由CSDN通过智能技术生成