Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用gevent下载多个文件_Python_Asynchronous_Download_Urllib2_Gevent - Fatal编程技术网

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。我可以将file
    write
    与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]