使用多进程同时在python中下载文件

时间:2017-03-01 16:54:32

标签: python concurrency download parallel-processing multiprocessing

我在下面制作了一个代码,使用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次下载。那么使用多处理是否合适? 还有其他更好的内存有效方法吗? 我是这些代码的初学者,所以请轻松地定义答案。 此致

3 个答案:

答案 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进行处理,并具有状态队列,工作人员可以在其中推送其进度报告或错误。

与手动控制相比,线程池或进程拉动大大简化了事情。