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

私はグリーンレットを使用するのが好きですが、多くのシステムにまたがる複数のプロセスを使用することや、複数のプロセスを実行する際のすべてのチェックとバランスを OS に任せる 1 つのシステムを使用することでメリットが得られることがよくあります。

ディスパッチャーの言うことを何でも実行する大量のリスナーを使用してディスパッチャーを作成する方法の良い例については、http://zeromq.org/ の ZeroMQ を参照してくださいまたは、リモートまたはローカルのタスクを並行して実行することをすばやく開始する方法については、execnet を確認してください。

私もhttp://spread.org/をよく使用し、共通の拡散デーモンをリッスンするシステムがたくさんあります。これは非常に便利なメッセージ バスであり、結果をプールして単一のスレッドから非常に簡単にディスパッチできます。

そしてもちろん、常に redis pub/sub または sync があります。:)

「負担を分かち合う」

于 2012-10-06T23:20:51.197 に答える