gevents:下载文件时出现“TypeError: 需要一个浮点数”错误消息

1 投票
1 回答
698 浏览
提问于 2025-04-18 07:28

我正在尝试使用gevents从网上下载一些图片。图片确实下载下来了,但在我合并这些任务的时候出现了以下错误。

pool.join(jobs)
TypeError: a float is required

虽然图片下载成功了,但我觉得我在使用线程方面做得不太对……有没有人知道我哪里出错了呢?

pool = Pool(3)
N = 3

urls = ['http://commons.wikimedia.org/wiki/File:Ultraviolet_image_of_the_Cygnus_Loop_Nebula_crop.jpg', 'http://commons.wikimedia.org/wiki/File:Ultraviolet_image_of_the_Cygnus_Loop_Nebula_crop.jpg,'http://commons.wikimedia.org/wiki/File:Ultraviolet_image_of_the_Cygnus_Loop_Nebula_crop.jpg'http://commons.wikimedia.org/wiki/File:Ultraviolet_image_of_the_Cygnus_Loop_Nebula_crop.jpg']

finished = 0

def download_file(url):
    global finished

    print('starting %s' % url)
    try:
        data = urllib2.urlopen(url, timeout=10000)
    except urllib2.URLError, e:
        print 'e : ' % e
    else:
        data = data.read()
        filename = os.path.basename(url)
        f = open(filename, 'wb')
    f.write(data)
    f.close()
    finally:
        finished += 1

with gevent.Timeout(10000000, False):
    for x in xrange(10, 10 + N):
        jobs = [pool.spawn(download_file, url) for url in urls]
        pool.join(jobs)

print('Finished %s' % (finished, N))

1 个回答

0
pool.join(jobs)
TypeError: a float is required

你需要一个浮点数,但你传入了其他类型的东西。

试着打印一下 jobs,看看它到底是什么类型。

print(jobs, type(jobs)) should help you see what is happening.

你在网址列表中漏掉了一个网址周围的 ' 符号。

根据 文档,join 方法需要以下参数: join(timeout=None, raise_error=False)

如果你去掉 join,代码就能运行,但你需要查看文档,了解你需要什么。

你的字符串格式化也不对,你有两个要格式化的参数,但只有一个 %s

你可以用 print('Finished {0} {1}'.format(finished, N)) 来实现。

撰写回答