重写数据库下载模块

This commit is contained in:
MarkusJoe
2022-03-03 21:22:02 +08:00
parent edaece5210
commit f322e8fae7
1 file changed
+39 -39
+38 -38
View File
@@ -6,51 +6,51 @@
# @File Name: downloader.py # @File Name: downloader.py
from concurrent.futures import ThreadPoolExecutor, wait import requests
from threading import Lock import threading
from requests import get
from bin.utils.logger import logger from bin.utils.logger import logger
lock = Lock()
class Threaded(threading.Thread):
class Downloader: def __init__(self, s, e, fp, id_, url):
def __init__(self, url, nums, file): super().__init__()
self.start_ = s
self.end_ = e
self.fp = fp
self.id = id_
self.url = url self.url = url
self.num = nums
self.name = file
r = get(self.url)
self.size = int(r.headers['Content-Length'])
logger.info('该文件大小为:{} bytes'.format(self.size))
def down(self, start, end): def download(self):
headers = {'Range': 'bytes={}-{}'.format(start, end)} logger.info(f'线程: {self.id} 开始下载')
r = get(self.url, headers=headers, stream=True) res = requests.get(self.url, headers={'Range': f'Bytes={self.start_}-{self.end_}'}).content
lock.acquire() self.fp.seek(self.start_)
with open(self.name, "rb+") as fp: self.fp.write(res)
fp.seek(start) logger.info(f'线程: {self.id} 结束下载')
fp.write(r.content)
lock.release()
def run(self): def run(self):
fp = open(self.name, "wb") self.download()
fp.truncate(self.size)
fp.close()
part = self.size // self.num def main(url: str, path: str = '.', workers: int = 8):
pool = ThreadPoolExecutor(max_workers=self.num) logger.info(f'本次下载使用线程数: {workers}')
futures = [] file_name = url.split('/')[-1]
for i in range(self.num): file_size = int(requests.get(url).headers['Content-Length'])
start = part * i if requests.get(url).status_code == '302':
if i == self.num - 1: url = requests.get(url).headers['Location']
end = self.size offset = int(file_size / workers)
start = 0
open(path + file_name, 'wb').close()
fp = open(path + file_name, 'r+b')
for i in range(workers):
if i == workers - 1:
end = file_size
elif i != 0:
end = i * offset
else: else:
end = start + part - 1 end = offset
logger.info('本线程下载范围: {}->{}'.format(start, end)) Threaded(start, end, fp, i, url).start()
futures.append(pool.submit(self.down, start, end)) start = end + 1
wait(futures)
logger.info('%s 下载完成' % self.name)
ss = Downloader( if __name__ == '__main__':
'https://themedatabase.vercel.app/source/sql', 6, "origin.sql") main('https://i0.hdslb.com/bfs/archive/cc013c0a726082e07772ec77d5c0444ac7d40a6f.jpg')
ss.run()