私は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)
私はこのコードを実行した場合、それは私に正常な出力を提供します。しかし、私はマルチプロセッシングを正しく実装していないと思います。このコードを最適化するための入力をお願いしますか?
ありがとうございます。
よろしく、 アシシュ
「トレースバック(最新の呼び出しの最後)として次のようになります。 ファイル "FileScanner.py"、ライン192、CREATE_POOLで create_threadpool(d_links、d_dir) ファイル "FileScanner.py" 、ライン195は、multiprocessing.Poolとcreate_threadpool に(4)プールとして: はAttributeError:私は申し訳ありませんあなたの提案 –
@AshishMisraごとに実装する場合 エラーの上__exit__」私は得たが、私はエラーを得ることはありません。私は2回、私の答えを編集しました。もう一度試してみてください。 –
@MatthiasGlich:ありがとう。実際にあなたは正しいですが、サーバー上の私のpythonバージョンは2.7であり、あなたの提案はPython 3からです。 –