100行实现多线程下载,不依赖任何第三方库

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。

项目地址

代码已经开源, mget 👏 Star

代码运行效果:

在这里插入图片描述

如何实现多线程下载

HTTP通过在HEAD添加Range头,可以实现分片下载,这样就可以实现多线程下载。

在下载之前先通过HEAD请求获取文件的大小,然后根据文件的大小,分配线程的下载区间,然后每个线程下载对应的区间,就可以实现多线程下载。

直接上代码

在这里插入图片描述

代码解析

整个代码没有用到任何的第三方库,都是用系统库实现的。

  • 11-20行:利用optparse解析命令行参数
  • 57-75行:通过创建实际大小的空文件,并且计算分片启动下载进程
    • 在第63行,启动了一个progress的队列,用来接收每个子线程的下载进度
    • 在第62行,获得这个文件的句柄给下载函数用
    • 在第26行,复制出文件的操作句柄,这样每个线程都有这个文件的独立句柄,写入文件的时候不会出现游标错乱,保证每个线程写入的数据不会相互覆盖
  • 78-90行:主线程等待子线程的下载进度,然后更新进度条
    • 在第82行,向命令行写入\r开头的字符,这样就可以实现进度条的更新,相当于每次从行首开始显示内容

整个代码简洁明了,方便大家学习多线程的数据同步、文件操作等知识。

如果大家对后端编程有兴趣,可以关注入职啦公众号,我们会定期更新后端编程的实战教程。

有想要学习编程的小伙伴也可以加入我们的项目实战交流群,会不定期更新项目资源在里面
项目交流群

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值