1

以下のコードでは、URLからのフェッチにマルチスレッドまたはマルチプロセスを使用することを検討しています。プールが理想的だと思います。誰かが解決策を提案するのを手伝ってもらえますか。

アイデア:スレッド/プロセスをプールし、データを収集します...私の好みはスレッドよりもプロセスですが、確かではありません。

import urllib

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')
#symbols = ('GGP')

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    data_fp = fetch_quote(symbols)
#    print data_fp
if __name__ =='__main__':
    main()
4

4 に答える 4

1

これが非常に簡単な例です。一度に1つずつ渡すシンボルを繰り返してfetch_quoteします。

import urllib
import multiprocessing

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')
#symbols = ('GGP')

def fetch_quote(symbol):
    url = URL % '+'.join(symbol)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data


def main():

    PROCESSES = 4
    print 'Creating pool with %d processes\n' % PROCESSES
    pool = multiprocessing.Pool(PROCESSES)
    print 'pool = %s' % pool
    print

    results = [pool.apply_async(fetch_quote, sym) for sym in symbols]

    print 'Ordered results using pool.apply_async():'
    for r in results:
        print '\t', r.get()

    pool.close()
    pool.join()

if __name__ =='__main__':
    main()
于 2010-09-08T16:50:25.443 に答える
1

一度に複数の情報を要求するプロセスがあります。これらの情報を1つずつ取得してみましょう。コードは次のようになります。

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    for symbol in symbols:
        data_fp = fetch_quote((symbol,))
        print data_fp

if __name__ == "__main__":
    main()

したがって、main()を呼び出して、URLごとに1つずつデータを取得します。プールでそれをマルチプロセスしましょう:

import urllib
from multiprocessing import Pool

URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv"
symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM', 'AIG', 'AMZN')

def fetch_quote(symbols):
    url = URL % '+'.join(symbols)
    fp = urllib.urlopen(url)
    try:
        data = fp.read()
    finally:
        fp.close()
    return data

def main():
    for symbol in symbols:
        data_fp = fetch_quote((symbol,))
        print data_fp

if __name__ =='__main__':
    pool = Pool(processes=5)
    for symbol in symbols:
        result = pool.apply_async(fetch_quote, [(symbol,)])
        print result.get(timeout=1)

次のメインでは、各シンボルのURLを要求するための新しいプロセスが作成されます。

注:Pythonでは、GILが存在するため、マルチスレッドはほとんどの場合、間違った解決策と見なす必要があります。

ドキュメントについては、Pythonでのマルチプロセッシングを参照してください。

于 2010-09-08T16:53:38.667 に答える
0

実際には、どちらもなしでそれを行うことは可能です。たとえばTwistedWebtwisted.web.client.getPageからのように、非同期呼び出しを使用して1つのスレッドでそれを実行できます

于 2010-09-08T16:38:16.477 に答える
-1

ご存知のように、PythonのマルチスレッドはGILのために実際にはマルチスレッドではありません。基本的に、特定の時間に実行されているのは単一のスレッドです。したがって、プログラムで常に複数のURLをフェッチする場合は、マルチスレッド化が適切でない可能性があります。また、クロール後、データを単一のファイルまたは永続的なデータベースに保存しますか?ここでの決定は、パフォーマンスに影響を与える可能性があります。

マルチプロセスはその方法でより効率的ですが、余分なプロセスが発生する時間とメモリのオーバーヘッドがあります。私は最近、Pythonでこれら両方のオプションを調べました。これがURLです(コード付き)-

python->マルチプロセッシングモジュール

于 2010-09-08T16:45:46.150 に答える