我在下面制作了一个代码,使用pySmartDL下载文件。我想一次下载多个文件。试图使用多进程实现它。但第二个过程仅在第一个完成时开始。代码如下:
import time
from multiprocessing import Process
from pySmartDL import SmartDL, HashFailedException
def down():
dest='/home/faheem/Downloads'
obj = SmartDL(url_100mb_file,dest, progress_bar=False,fix_urls=True)
obj.start(blocking=False)
#cnt=1
while not obj.isFinished():
print("Speed: %s" % obj.get_speed(human=True))
print("Already downloaded: %s" % obj.get_dl_size(human=True))
print("Eta: %s" % obj.get_eta(human=True))
print("Progress: %d%%" % (obj.get_progress()*100))
print("Progress bar: %s" % obj.get_progress_bar())
print("Status: %s" % obj.get_status())
print("\n"*2+"="*50+"\n"*2)
print("SIZE=%s"%obj.filesize)
time.sleep(2)
if obj.isSuccessful():
print("downloaded file to '%s'" % obj.get_dest())
print("download task took %ss" % obj.get_dl_time(human=True))
print("File hashes:")
print(" * MD5: %s" % obj.get_data_hash('md5'))
print(" * SHA1: %s" % obj.get_data_hash('sha1'))
print(" * SHA256: %s" % obj.get_data_hash('sha256'))
data=obj.get_data()
else:
print("There were some errors:")
for e in obj.get_errors():
print(str(e))
return
if __name__ == '__main__':
#jobs=[]
#for i in range(5):
print 'Link1'
url_100mb_file = ['https://softpedia-secure-download.com/dl/45b1fc44f6bfabeddeb7ce766c97a8f0/58b6eb0f/100255033/software/office/Text%20Comparator%20(v1.2).rar']
Process(target=down()).start()
print'link2'
url_100mb_file = ['https://www.crystalidea.com/downloads/macsfancontrol_setup.exe']
Process(target=down()).start()
这里link2在link1完成时开始下载,但我需要同时下载同时执行。我想实现此方法一次最多执行10次下载。那么使用多处理是否合适? 还有其他更好的内存有效方法吗? 我是这些代码的初学者,所以请轻松地定义答案。 此致
答案 0 :(得分:0)
您正在使用的特定库似乎已经支持非阻塞下载,为什么不执行以下操作?非阻塞意味着它将在一个单独的过程中运行。
from time import sleep
from pySmartDL import SmartDL
links = [['https://softpedia-secure download.com/dl/45b1fc44f6bfabeddeb7ce766c97a8f0/58b6eb0f/100255033/software/office/Text%20Comparator%20(v1.2).rar'],['https://www.crystalidea.com/downloads/macsfancontrol_setup.exe']]
objs = [SmartDL(link, progress_bar=False) for link in links]
for obj in objs:
obj.start(blocking=False)
while not all(obj.isFinished() for obj in objs):
sleep(1)
答案 1 :(得分:0)
您也可以使用python模块Thread
。以下是它的工作原理:
import threading
import time
def func(i):
time.sleep(i)
print i
for i in range(1, 11):
thread = threading.Thread(target = func, args=(i,))
thread.start()
print "Launched thread " + str(i)
print "Done"
运行此代码段,您将对其工作原理有一个完美的了解。
知道了,你可以实际运行你的代码,作为参数传递给url
在每个线程中使用的函数。
希望有所帮助
答案 2 :(得分:0)
由于您的程序受I / O约束,您可以使用多处理或多线程。
为了以防万一,我想提醒像这样的问题的经典模式。拥有一个URL队列,工作进程/线程从中拉出URL进行处理,并具有状态队列,工作人员可以在其中推送其进度报告或错误。
与手动控制相比,线程池或进程拉动大大简化了事情。