找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3161|回复: 0

[求助] 多线程文件写入问题

0

主题

0

帖子

0

积分

贫民

积分
0
gebixiaowang 发表于 2017-3-8 17:26:25 | 显示全部楼层 |阅读模式
本帖最后由 gebixiaowang 于 2017-3-8 17:28 编辑

下面这段关于多个线程下载文件的代码,在linux下面运行正常,在windows上跑下载的图片不能正常打开,而且每次下载的图片文件大小都不一样。


  1. import requests
  2. import threading

  3. class downloader:
  4.     # 构造函数
  5.     def __init__(self):
  6.         # 设置url
  7.         self.url='http://image03.u69cn.com/2013/contentinfo/105379_zi.jpg'
  8.         # 设置线程数
  9.         self.num=8
  10.         # 文件名从url最后取
  11.         self.name=self.url.split('/')[-1]
  12.         # 用head方式去访问资源
  13.         r = requests.head(self.url)
  14.         # 取出资源的字节数
  15.         self.total = int(r.headers['Content-Length'])
  16.         print 'total is %s' % (self.total)
  17.     def get_range(self):
  18.         ranges=[]
  19.         # 比如total是50,线程数是4个。offset就是12
  20.         offset = int(self.total/self.num)
  21.         for i in  range(self.num):
  22.             if i==self.num-1:
  23.                 # 最后一个线程,不指定结束位置,取到最后
  24.                 ranges.append((i*offset,''))
  25.             else:
  26.                 # 没个线程取得区间
  27.                 ranges.append((i*offset,(i+1)*offset))
  28.         # range大概是[(0,12),(12,24),(25,36),(36,'')]
  29.         return ranges
  30.             
  31.         return ranges
  32.     def download(self,start,end):
  33.         headers={'Range':'Bytes=%s-%s' % (start,end),'Accept-Encoding':'*'}
  34.         # 获取数据段
  35.         res = requests.get(self.url,headers=headers)
  36.         # seek到指定位置
  37.         print '%s:%s download success'%(start,end)
  38.         self.fd.seek(start)
  39.         self.fd.write(res.content)
  40.     def run(self):
  41.         # 打开文件,文件对象存在self里
  42.         self.fd =  open(self.name,'w')
  43.         thread_list = []

  44.         n = 0
  45.         for ran in self.get_range():
  46.             start,end = ran
  47.             print 'thread %d start:%s,end:%s'%(n,start,end)
  48.             n+=1
  49.             # 开线程
  50.             thread = threading.Thread(target=self.download,args=(start,end))
  51.             thread.start()
  52.             thread_list.append(thread)
  53.         for i in thread_list:
  54.             # 设置等待
  55.             i.join()
  56.         print 'download %s load success'%(self.name)
  57.         self.fd.close()
  58. if __name__=='__main__':
  59.     # 新建实例
  60.     down = downloader()
  61.     # 执行run方法
  62.     down.run()
复制代码

请问这是为什么呢?除了加锁,windows上有没有其他办法解决?

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表