我想使用线程一次下载多个文件。
这是我尝试过的:
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()缺少1个必需的位置参数:'fl'
如何使用此pool.imap
答案 0 :(得分:0)
想象一下x
函数是只读的(例如在其他库中),那么你必须通过中间函数fetch
。
imap
但由于您可以控制映射功能,因此将其更改为接受url和filename的元组。
pool.imap(lambda (u,f): fetch(u, f), zip(dlList, dlFList))
不喜欢吵架吗?使文件名可以从url计算,例如,通过字典查找或字符串处理。
def fetch(t):
url, filename = t
urllib.request.urlretrieve(url, filename)
return t
pool.imap(fetch, zip(dlList, dlFList))