python: gevent轻松实现并行下载多个文件

标签: Python | 发表时间:2011-08-06 10:21 | 作者:ah__fu frank28_nfls
出处:http://hi.baidu.com/ah%5F%5Ffu

#!/bin/python

# file: download.py

 

import gevent

from gevent import socket

from gevent import monkey; monkey.patch_all()

import sys

import urllib2

 

def download(url):

    try:

        url_opener = urllib2.urlopen(url)

    except:

        print 'open url error'

        return

    if url_opener.code!=200:

        print 'return code is:%d'%(url_opener.code)

        return

    if not url_opener.headers.has_key('Content-Length'):

        print 'no content length'

        return

    content_length = long(url_opener.headers['Content-Length'])

    download_size = 0

    file_name = url[url.rfind('/')+1:]

    target_file = open(file_name, 'wb')

    while download_size<content_length:

        try:

            str_content = url_opener.read(1024)

        except Exception,e:

            print 'read error:%s' % (str(e))

            return

        if not str_content or len(str_content)==0:

            print 'read error, connection close'

            return

        target_file.write(str_content)

        download_size += len(str_content)

        print '[%s]:download size:%d, progress:%d' % (

                    file_name,

                    download_size,

                    int(float(download_size)/float(content_length)*100.0))

    print '[%s]:download complete!' % (file_name)

 

if __name__=='__main__':

    argc = len(sys.argv)

    if argc<2:

        print 'usage:%s <url> [url...]' % (sys.argv[0])

        sys.exit(-1)

    jobs = [gevent.spawn(download,url) for url in sys.argv[1:]]

    gevent.joinall(jobs, timeout=600)

 

'''

感谢Thijs同学的推荐!利用协程,在一个函数中从头写到尾就能实现并行,实在是太爽了。

相比之下,twisted中眼花缭乱的回调,学习曲线实在是太陡峭了! 

'''

阅读全文
类别:Python 查看评论

相关 [python gevent 并行] 推荐:

python: gevent轻松实现并行下载多个文件

- frank28_nfls - 阿福的技术BLOG
利用协程,在一个函数中从头写到尾就能实现并行,实在是太爽了. 相比之下,twisted中眼花缭乱的回调,学习曲线实在是太陡峭了.

Cython 0.15,用 OpenMP 并行多核加速 Python!

- QQ - 赖勇浩的编程私伙局
赖勇浩(http://laiyonghao.com). 0、读懂这篇文章需要了解 OpenMP 基本用法. 1、读懂这篇文章需要了解 GIL 基本概念. 2、基本上是这篇的翻译:http://docs.cython.org/src/userguide/parallelism.html,标题是我自己取的,如有错漏、不明,敬请参详原文.

Gevent: 优点,缺点,以及不优美的地方

- jin - python.cn(jobs, news)
我不想用很多时间去描述Gevent是什么,我想它官网上的一句总结足矣:. “Gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API. 接下来我将阐述在Mixpanel中一个内部项目使用Gevent的经验. 为了这篇文章我还动手写了几个性能小测试.

Flask, Tornado, GEvent, 以及它们的结合的性能比较

- Ken - python.cn(jobs, news)
英文: http://blog.wensheng.com/2011/10/performance-of-flask-tornado-gevent-and.html. 我在选一个python的互联网框架, 本来已经定下来用Tornado了.  但我还听到很多人推荐Flask的简单性和灵活性, 还有gevent的高性能, 所以决定也试试它们以及它们和Tornado的结合.

dropbox讲python

- chuang - Initiative
dropbox定制优化CPython虚拟机,自己搞了个malloc调度算法. 那个 !!!111cos(0). 期待这次PyCon China 2011.

Python调试

- - 企业架构 - ITeye博客
原文地址: http://blog.csdn.net/xuyuefei1988/article/details/19399137. 1、下面网上收罗的资料初学者应该够用了,但对比IBM的Python 代码调试技巧:. IBM:包括 pdb 模块、利用 PyDev 和 Eclipse 集成进行调试、PyCharm 以及 Debug 日志进行调试:.

Python WSGI 初探

- - 坚实的幻想
在构建 Web 应用时,通常会有 Web Server 和 Application Server 两种角色. 其中 Web Server 主要负责接受来自用户的请求,解析 HTTP 协议,并将请求转发给 Application Server,Application Server 主要负责处理用户的请求,并将处理的结果返回给 Web Server,最终 Web Server 将结果返回给用户.

Python实现逻辑回归(Logistic Regression in Python)

- - 神刀安全网
Logistic Regression in Python ,作了中文翻译,并相应补充了一些内容. 本文并不研究逻辑回归具体算法实现,而是使用了一些算法库,旨在帮助需要用Python来做逻辑回归的训练和预测的读者快速上手. 逻辑回归是一项可用于预测二分类结果(binary outcome)的统计技术,广泛应用于金融、医学、犯罪学和其他社会科学中.

python 下载文件

- Eric - python相关的python 教程和python 下载你可以在老王python里寻觅
之前给大家分享的python 多线程抓取网页,我觉的大家看了以后,应该会对python 抓取网页有个很好的认识,不过这个只能用python 来抓取到网页的源代码,如果你想用做python 下载文件的话,上面的可能就不适合你了,最近我在用python 做文件下载的时候就遇到这个问题了,不过最终得以解决,为了让大家以后碰过这个问题有更好的解决办法,我把代码发出来:.

python代码调试

- - 阿里古古
【转自: http://blog.csdn.net/luckeryin/article/details/4477233】. 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序. 例如,有模拟税收计算的程序:. debug_demo函数计算4500的入账所需的税收. 在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试).