1

我很想让这个程序在速度上提高很多。它在 10 分钟内读取 +- 12000 页。我想知道是否有什么对速度有很大帮助的东西?我希望你们知道一些提示。我应该阅读 +- 数百万页......所以这会花费太长时间:(这是我的代码:

from eventlet.green import urllib2                          
import httplib                                              
import time                                                 
import eventlet   

# Create the URLS in groups of 400 (+- max for eventlet)                                    
def web_CreateURLS():
    print str(str(time.asctime( time.localtime(time.time()) )).split(" ")[3])
    for var_indexURLS in xrange(0, 2000000, 400):
        var_URLS = []
        for var_indexCRAWL in xrange(var_indexURLS, var_indexURLS+400):
            var_URLS.append("http://www.nu.nl")
        web_ScanURLS(var_URLS)    

# Return the HTML Source per URL
def web_ReturnHTML(url):
    try:
        return [urllib2.urlopen(url[0]).read(), url[1]]
    except urllib2.URLError:
        time.sleep(10)
        print "UrlError"
        web_ReturnHTML(url)

# Analyse the HTML Source
def web_ScanURLS(var_URLS):
    pool = eventlet.GreenPool()
    try:  
        for var_HTML in pool.imap(web_ReturnHTML, var_URLS):
               # do something etc..
    except TypeError: pass

web_CreateURLS()
4

1 回答 1

1

我喜欢使用 greenlets.. 但我经常受益于使用分布在许多系统上的多个进程.. 或者只有一个系统让操作系统负责运行多个进程的所有检查和平衡。

查看http://zeromq.org/上的 ZeroMQ 以获得一些很好的示例,了解如何使用大量的侦听器创建调度器,这些侦听器可以执行调度器所说的任何操作。或者查看 execnet,了解一种快速开始并行执行远程或本地任务的方法。

我也经常使用http://spread.org/并且有很多系统在监听一个通用的传播守护进程。它是一个非常有用的消息总线,结果可以很容易地汇集回单个线程并从单个线程分派。

然后当然总是有 redis pub/sub 或同步。:)

“分担负担”

于 2012-10-06T23:20:51.197 回答