簡體   English   中英

在Python中優化多線程以下載文件

[英]Optimization in Multithreading in Python to download files

我是python的新手。 當前,我正在嘗試實現一個程序以從遠程服務器(http / https)下載大量文件。 沒有 的文件很大(> 1000)。 為了解決這個問題,我需要以某種方式實現代碼,以便它可以以有效和最佳的方式利用OS資源。 我采用的方法是多處理。

這是我的實現:

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)

如果我運行此代碼,它將為我提供正常的輸出。 但是我認為我沒有正確實現多處理。 您能否提供一些輸入信息來優化這段代碼?

提前致謝。

問候,Ashish

你可以這樣做

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阻塞了該過程,直到被調用函數返回

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM