【问题标题】:Optimization in Multithreading in Python to download filesPython中多线程下载文件的优化
【发布时间】:2017-01-23 15:02:18
【问题描述】:

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

这里是我的实现:

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)

如果我运行这段代码,它会给我正常的输出。但我认为我没有正确实现多处理。您能否提供一些意见来优化这段代码?

提前致谢。

问候, 灰烬

【问题讨论】:

    标签: python python-2.7 python-multiprocessing download


    【解决方案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 并行执行这项工作,但 map 会阻塞进程,直到被调用的函数返回

    【讨论】:

    • 'Traceback(最近一次调用最后):文件“FileScanner.py”,第 192 行,在 create_pool create_threadpool(d_links, d_dir) 文件“FileScanner.py”,第 195 行,在具有多处理的 create_threadpool 中。 Pool(4) as pool: AttributeError: exit' 上面的错误如果我按照你的建议实施
    • @AshishMisra 抱歉,但我没有收到错误消息。我已经编辑了我的答案两次,也许再试一次
    • @MatthiasGlich:谢谢。其实你是对的,但我在服务器上的 python 版本是 2.7,你的建议来自 python 3。
    【解决方案2】:

    我在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      相关资源
      最近更新 更多