python 开启多线程 在多资源情况下共同下载一个文件

import os
from threading import Thread,Lock

#假定一个资源目录列表
urls = ['/home/桌面/',
	   '/home/文档/',
	   '/home/音乐/',
	   '/home/下载/',
	   '/home/视频/',
	   ]

#生成锁
lock = Lock()

filename = input('要下载的文件:')

#判断资源库路径中文件是否存在,将存在的路径存储到单独列表中
explorer = []
for i in urls:
	#判断资源库路径中文件是否存在,若存在则添加到列表中
	if os.path.exists(i+filename):
		explorer.append(i+filename)

num = len(explorer)	#获取有多少资源
if num == 0:
	print('没有资源')
	os._exit(0)	#没有资源直接退出进程
	
#获取目标资源大小	
size = os.path.getsize(explorer[0])
#根据资源数创建对应的线程,每个线程负责下载block_size这么多
block_size = size // num + 1	

#打开一个要写入数据的目标文件(共享资源)
fd = open(filename,'wb')

#下载文件的函数
def load(path,num):
	#读
	f = open(path,'rb')
	
	seek_types = block_size * n
	#每个线程偏移到对应的位置去下读取,读取时不需要上锁
	f.seek(seek_types)
	
	#循环读取,每次读1024
	size = block_size 	#每个线程需要读取的总大小

	lock.acquire()	#写入时上锁:打开的文件是线程共享资源,需要在线程操作共享资源的地方上锁
	fd.seek(block_size * num)
	while True:
		#如果读到大小小于1024,直接全读掉
		if size < 1024:
			data = f.read(size)	#读
			fd.write(data)		#写
			break
		#如果大小大于1024,每次读1024
		else:
			data = f.read(size) 	#读
   			fd.write(data)  	#写
			size -= 1024

	#释放锁
	lock.release()

#n表示每个线程要下载的部分的偏移量
n = 0
jobs = []
#开始创建线程,有多少个资源就用多少个线程去下载
for path in explorer:
	t = Thread(target=load,args=(path,n))
	jobs.append(t)
	t.start()
	n += 1

for i in jobs:
	i.join()

你可能感兴趣的:(多线程,#python)