Python 使用gevent下载多个文件
我正在尝试使用Python 使用gevent下载多个文件,python,asynchronous,download,urllib2,gevent,Python,Asynchronous,Download,Urllib2,Gevent,我正在尝试使用[gevent][1] 我的代码是对建议的代码的轻微修改 代码的作用是: 经过一些清洗 gevent.spawnspawns下载并保存文件其中: 检查文件是否已下载 如果没有,则使用urllib2.urlopen(完整url.read() 在的帮助下保存文件 我的印象是下载和保存只能按顺序进行。此外,我的应用程序处于备用状态。我可以添加一个超时,但我想在代码中优雅地处理失败 想知道我是否做错了什么-这是我第一次用python编写代码 编辑 下面是使用“线程”的代码版本 我对此进行了
[gevent][1]
我的代码是对建议的代码的轻微修改
代码的作用是:
gevent.spawn
spawns下载并保存文件
其中:urllib2.urlopen(完整url.read()
超时
,但我想在代码中优雅地处理失败
想知道我是否做错了什么-这是我第一次用python编写代码
编辑
下面是使用“线程”的代码版本
我对此进行了更深入的研究,基本问题是gevent.spawn()创建greenlet而不是进程(所有greenlet都在单个OS线程中运行) 尝试一个简单的方法:
import gevent
from time import sleep
g = [gevent.spawn(sleep, 1) for x in range(100)]
gevent.joinall(g)
你会看到这需要100秒的时间。这证明了上述观点
您实际上是在寻找多线程,这可以在线程模块中找到。
请看以下问题:。我想知道一点怎么做
---更新---
下面是一个快速示例,说明了如何执行此操作:
threads = [threading.Thread(target=sleep, args=(1,)) for x in range(10)]
[thread.start() for thread in threads]
[thread.join() for thread in threads]
我不知道这是否有影响,但在尝试运行代码时,我看到您的函数定义中有yr和qtr,但使用了变量名y和q?感谢您的关注。否,
y
和q
在download\u xbrl\u files
中定义,然后作为参数传递到gevent.spawn中lambda中的download\u和\u save\u file
。问题在于gevent.spawn
的工作方式很好,正如之前发布答案的用户所指出的(答案在哪里?),但是为什么在下载和保存文件功能中有yr和qtr,我看不到它们在哪里使用?(您使用的y和q超出了函数的范围…)哦,您说得对。这是我进行重构时引入的一个错误,我在这里发布了一个“较小”的代码示例。@cchristelis:修复了这个错误,但是gevent.spawn的一般问题不是solvedOK,我明白了。我在示例中看到,它们只有urlopen read。我可以将filewrite
与thread.start和thread.join结合使用吗?这应该是一个非常简单的技术交换,您只是在交换线程库,所以是的,我看不出您需要对其余代码进行太多更改的原因。@noideahowtofix我更新了我的答案,让您了解这种交换的外观。希望这有帮助。我现在正在使用线程(请参阅我对原始问题的编辑),但我仍然看不到并行性。这与Python GIL有关吗?
import gevent
from time import sleep
g = [gevent.spawn(sleep, 1) for x in range(100)]
gevent.joinall(g)
threads = [threading.Thread(target=sleep, args=(1,)) for x in range(10)]
[thread.start() for thread in threads]
[thread.join() for thread in threads]