0

我已经做了一个代码下载使用pySmartDL文件。我想一次下载多个文件。试图用多进程来实现它。但第二个过程只有在第一个完成时才会启动。代码如下:使用多进程并发下载python文件

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次下载。那么使用多重处理是否好? 有没有其他更好的记忆效率的方法。 我是这些代码的初学者,所以请好好定义答案。 Regards

回答

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以在每个线程中使用。

希望帮助

+0

线程工作正常..是否有可能检索下载两个下载状态分别到数据库或其他东西。 @Carles Mitjans Regards – faheemKurikkal

+0

谢谢你的回答它工作得很好。用两条非常完美的线程来试试这个。如何分别停止任何特定的线程,而不会对其他线程产生任何改动...关于 – faheemKurikkal

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) 
+0

谢谢你的帮助..但我试图在torrent下载中实现这一点。下载链接将通过数据库输入实时添加,因此无法提前提供链接。我只是把它作为一个例子.. @nico问候 – faheemKurikkal

0

因为你的程序是I/O限制,可以使用多处理 MULT线程。

为了以防万一,我想提醒古典模式这样的问题。有一个URL队列,工作进程/线程通过该队列提取URL进行处理,并有一个状态队列,工作人员可以推送他们的进度报告或错误。

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

+0

您能否用代码展示一些示例...我无法让您很好。是否可以同时多次调用相同的函数?该系统将只有约1Gb的RAM ..关心9000 – faheemKurikkal