python 多線程將大文件分開下載后在合并的實例
更新時間:2018年11月09日 09:21:28 作者:聽雪聲的春天
今天小編就為大家分享一篇python 多線程將大文件分開下載后在合并的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
廢話不多說了,上代碼吧:
import threading
import requests
import time
import os
class Mythread(threading.Thread):
def __init__(self,url,startpos,endpos,f):
super(Mythread,self).__init__()
self.url=url
self.startpos=startpos
self.endpos=endpos
self.fd=f
def download(self):
print('start thread:%s at %s'%(self.getName(),time.time()))
headers={'Range':'bytes=%s-%s'%(self.startpos,self.endpos)}
res=requests.get(self.url,headers=headers)
self.fd.seek(self.startpos)
self.fd.write(res.content)
print('Stop thread:%s at%s'%(self.getName(),time.time()))
self.fd.close()
def run(self):
self.download()
if __name__=="__main__":
url='http://www.wendangxiazai.com/word/b-cfbdc77931b765ce050814a9-1.doc'
filename=url.split('/')[-1]
filesize=int(requests.head(url).headers['Content-Length'])
print('%s filesize:%s'%(filename,filesize))
threadnum=3
threading.BoundedSemaphore(threadnum)#允許線程個數(shù)
step=filesize//threadnum
mtd_list=[]
start=0
end=-1
tempf = open('E:\Python\py\web'+filename,'w')
tempf.close()
mtd_list=[]
with open('E:\Python\py\web'+filename,'rb+')as f:
#獲得文件句柄
fileno=f.fileno()#返回一個整型的文件描述符,可用于底層操作系統(tǒng)的 I/O 操作
while end<filesize-1:
start=end+1
end=start+step-1
if end>filesize:
end=filesize
print ('Start:%s,end:%s'%(start,end))
dup=os.dup(fileno)#復制文件句柄
fd=os.fdopen(dup,'rb+',-1)
t=Mythread(url,start,end,fd)
t.start()
mtd_list.append(t)
for i in mtd_list:
i.join()
f.close()
以上這篇python 多線程將大文件分開下載后在合并的實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Jmeter調(diào)用Python腳本實現(xiàn)參數(shù)互相傳遞的實現(xiàn)
這篇文章主要介紹了Jmeter調(diào)用Python腳本實現(xiàn)參數(shù)互相傳遞的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01

