|
本帖最后由 gebixiaowang 于 2017-3-8 17:28 编辑
下面这段关于多个线程下载文件的代码,在linux下面运行正常,在windows上跑下载的图片不能正常打开,而且每次下载的图片文件大小都不一样。
- import requests
- import threading
- class downloader:
- # 构造函数
- def __init__(self):
- # 设置url
- self.url='http://image03.u69cn.com/2013/contentinfo/105379_zi.jpg'
- # 设置线程数
- self.num=8
- # 文件名从url最后取
- self.name=self.url.split('/')[-1]
- # 用head方式去访问资源
- r = requests.head(self.url)
- # 取出资源的字节数
- self.total = int(r.headers['Content-Length'])
- print 'total is %s' % (self.total)
- def get_range(self):
- ranges=[]
- # 比如total是50,线程数是4个。offset就是12
- offset = int(self.total/self.num)
- for i in range(self.num):
- if i==self.num-1:
- # 最后一个线程,不指定结束位置,取到最后
- ranges.append((i*offset,''))
- else:
- # 没个线程取得区间
- ranges.append((i*offset,(i+1)*offset))
- # range大概是[(0,12),(12,24),(25,36),(36,'')]
- return ranges
-
- return ranges
- def download(self,start,end):
- headers={'Range':'Bytes=%s-%s' % (start,end),'Accept-Encoding':'*'}
- # 获取数据段
- res = requests.get(self.url,headers=headers)
- # seek到指定位置
- print '%s:%s download success'%(start,end)
- self.fd.seek(start)
- self.fd.write(res.content)
- def run(self):
- # 打开文件,文件对象存在self里
- self.fd = open(self.name,'w')
- thread_list = []
- n = 0
- for ran in self.get_range():
- start,end = ran
- print 'thread %d start:%s,end:%s'%(n,start,end)
- n+=1
- # 开线程
- thread = threading.Thread(target=self.download,args=(start,end))
- thread.start()
- thread_list.append(thread)
- for i in thread_list:
- # 设置等待
- i.join()
- print 'download %s load success'%(self.name)
- self.fd.close()
- if __name__=='__main__':
- # 新建实例
- down = downloader()
- # 执行run方法
- down.run()
复制代码
请问这是为什么呢?除了加锁,windows上有没有其他办法解决?
|
|