2017-01-23 35 views
0

我是新来的python。目前,我试图实现一个程序来从远程服务器(http/https)下载大量文件。没有。的文件很大(> 1000)。为了处理这个问题,我需要以某种方式实现代码,以便能够以高效和最优的方式利用操作系统资源。为了处理这个问题,我采取的方式是多处理。在Python中的多线程优化下载文件

这里,是我实现:

import urllib,urlparse 
import urllib2 
import os 
import multiprocessing 
from multiprocessing.dummy import Pool as ThreadPool 
from itertools import repeat 

def download_file((url, d_dir)) : 
    #logger.debug('Download URL -> ' + url) 

    try : 
     with open(d_dir + os.sep + urlparse.urlparse(url).path, 'wb') as tfile : 
      tfile.write(urllib2.urlopen(url).read()) 

    except : 
     logger.error('There was a some problem while downloading file, ' + url) 


def create_pool(d_links, d_dir) : 
    pool = multiprocessing.Pool(processes=10) 
    pool.map(download_file, zip(d_links, repeat(d_dir))) 

def extract_urls() : 
    # some logic to extract urls from files 
    links = {‘url1’, ‘url2’, ‘url3’, ‘url4’, ‘url5’, …} 

    #created process pool 
    create_pool(links, l_dir) 

如果我运行这段代码,它给了我正常输出。但我想我没有正确实现多处理。你可以给一些输入来优化这段代码吗?

在此先感谢。

问候, 阿希什

回答

1

你可以做到这一点

import multiprocessing as mp 
with mp.Pool(4) as pool: 
    pool.map_async(download_file, zip(d_links, repeat(d_dir))) 

参考:https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool

注意map_async不平行的工作,但地图块的过程,直到被叫函数返回

+0

“回溯(最近通话最后一个): 文件 “FileScanner.py”,线路192,在create_pool create_threadpool(d_links,d_dir) 文件 “FileScanner.py” ,第195行,在create_threadpool 与multiprocessing.Pool(4)作为池: AttributeError:__exit__' 以上错误我得到如果我按照您的建议实施 –

+0

@AshishMisra抱歉,但我没有得到错误。我编辑了我的答案两次,也许再试一次 –

+0

@MatthiasGlich:谢谢。其实你是对的,但我的服务器上的python版本是2.7,你的建议是从python 3。 –

0

我在python 2.7中遇到了同样的问题。问题是multiprocessing库在pool.map(func,arg)中不支持多个参数。作为我使用pathos的多处理库的解决方案。 所以你的功能可能是如下

from pathos.multiprocessing import ProcessingPool as Pool 
from itertools import izip 

p = Pool(self.nbr_processes) 
     try: 
      p.map(download_file, izip(d_links, repeat(d_dir))) 
      p.close() 
      p.join() 

     except Exception as f: 
      logging.error(f)