2017-10-17 9 views
0

多くのファイルを一度にダウンロードするためにスレッドを使用したいと思います。イベントレットでファイルをダウンロード

は、ここで私が試したものです:dListurlsdlFListのリストがある

import eventlet 
from urllib.request import urlopen 

def fetch(url, fl): 
    urllib.request.urlretrieve(url, fl) 
    return url, fl 

pool = eventlet.GreenPool() 
for url, fl in pool.imap(fetch, dlList, dlFList): 
    print("downloaded " + url + " to " + fl) 

は、宛先ファイルのリストです。あなたを、

TypeError: fetch() missing 1 required positional argument: 'fl'

私が正しくfetch機能を想像してみて、このpool.imap

答えて

0

を超える1つの引数を渡すにはどうすればよい(他のライブラリで、たとえば)のみ読みました:

はしかし、私はエラーを取得します中間関数にはimapが必要です。

pool.imap(lambda (u,f): fetch(u, f), zip(dlList, dlFList)) 

ただし、マッピング機能を制御できるので、urlとfilenameのタプルを受け入れるように変更してください。

def fetch(t): 
    url, filename = t 
    urllib.request.urlretrieve(url, filename) 
    return t 

pool.imap(fetch, zip(dlList, dlFList)) 

タップする気がしませんか?たとえば、辞書検索や文字列処理など、urlからファイル名を計算可能にする。

url_filename_map = dict(zip(dlList, dlFList)) # or build dict some other way 

def fetch(url): 
    filename = url_filename_map[url] 
    # or 
    filename = '/path/prefix/' + hashlib.md5(url).hexdigest() 
    urllib.request.urlretrieve(url, filename) 
    return url, filename 

pool.imap(fetch, url_filename_map) # same as imap(fetch, urlmap.keys()) 
関連する問題