使用eventlet下载文件

时间:2017-10-17 00:58:21

标签: python multithreading python-3.x eventlet

我想使用线程一次下载多个文件。

这是我尝试过的:

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)

其中dListurls的列表,dlFList是目标文件列表。

然而,我收到错误:

  

TypeError:fetch()缺少1个必需的位置参数:'fl'

如何使用此pool.imap

正确传递多个参数

1 个答案:

答案 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))