我想使用线程一次下载多个文件。
以下是我尝试过的:
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)其中dList是urls的列表,dlFList是目标文件的列表。
但是,我得到了错误:
TypeError: fetch()缺少一个必需的位置参数:'fl‘
如何使用此pool.imap正确传递多个参数
发布于 2017-10-18 01:20:26
假设fetch函数是只读的(例如在其他库中),那么您必须对中间函数进行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())https://stackoverflow.com/questions/46780981
复制相似问题