我该怎么做才能让我的程序运行得更快?

时间:2012-03-30 21:19:46

标签: python multithreading multiprocessing

我有一个python程序,它处理一个html页面并创建一个url字典作为键和文件的md5sum作为值。字典长度为6000.每个url都是一个zip文件,可以下载到机器中,每次下载文件后都会检查md5sum。要下载的所有文件的总大小为572 GB。

网址是一个字典,其中包含下载链接作为键,文件的md5sum作为值

代码是

        DownloadAllURLs(URLs)

        def DownloadAllURLs(URLs):
            for eachurl in URLs:
                if os.path.isfile(eachurl):
                     print eachurl, "already exists"
                else:
                     print "Going to Download",eachurl
                     Download(eachurl)
                     CheckMd5(eachurl,URLs(eachurl))

        def Download(eachurl):
            command='sudo wget --user=abc --password=xyz'
            command=command+" "+url
            print command
            result=subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
            out, err=result.communicate()

        def CheckMd5(url,tail,md5sum):
            command=['md5sum',tail]
            result=subprocess.Popen(command,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
            md5, err=result.communicate()
            if(md5[:32]==md5sum):
                print "The",tail,"is downloaded successufully with correct md5"
            else:
                print "The",tail,"is not downloaded correcty wrong md5"
               WriteWarcFile(url,tail)
               CheckMd5(url,tail,md5sum)

以上代码为我下载了所有6000个zip文件,但我下载的服务器速度非常慢,下载时我只有40-60 kbps的速度...

我使用上面的代码下载类似1-3 TB的数据....我想在python中并行化我的代码(因此处理所需的时间将减少)但我不确定是否使用多线程或多处理或其他任何事情。

我正在阅读教程,但不知道如何继续。谢谢

编辑:

感谢所有的回复,我想问的主要问题是如何在这种情况下应用多线程/多线程。假设我正在对每个URL进行一些操作而不是像下面的代码一样下载它,我可以使用多线程或多处理来更快地进行操作

    from urlparse import urlparse
    ProcessAllURLs(URLs)
    def ProcessAllURLs(URLs):
        for eachurl in URLs:
                x=urlparse(eachurl)
                print eachurl.netloc

1 个答案:

答案 0 :(得分:0)

由于处理是IO限制的,因此应该可以使用python多线程 - 全局解释器锁定不会影响性能