2017-01-23 5 views
0

私はPythonを初めて使用しています。現在、リモートサーバー(http/https)から大量のファイルをダウンロードするプログラムを実装しようとしています。いいえ。ファイルの数が多い(> 1000)。これを処理するには、効率的かつ最適な方法でOSリソースを利用できるように、コードを実装する必要があります。これを処理するために、私が取った方法はマルチプロセッシングです。ここでファイルをダウンロードするための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は、multiprocessing.Poolとcreate_threadpool に(4)プールとして: はAttributeError:私は申し訳ありませんあなたの提案 –

+0

@AshishMisraごとに実装する場合 エラーの上__exit__」私は得たが、私はエラーを得ることはありません。私は2回、私の答えを編集しました。もう一度試してみてください。 –

+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) 
関連する問題