31

Python + boto +マルチプロセッシング、S3cmd、J3tsetを使用してみましたが、すべてに苦労しました。

何か提案がありますか、おそらくあなたが使っている既製のスクリプトか、私が知らない別の方法ですか?

編集:

eventlet + botoは、以下で説明するように価値のあるソリューションです。ここで優れたイベントレットリファレンス記事を見つけましたhttp://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

現在使用しているPythonスクリプトを以下に追加しました。

4

2 に答える 2

35

さて、@MattBillenstienのヒントに基づいて解決策を見つけました。イベントレットライブラリを使用します。ここで最も重要なのは最初のステップです(標準IOライブラリのモンキーパッチ)。

このスクリプトをnohupを使用してバックグラウンドで実行すると、準備が整います。

from eventlet import *
patcher.monkey_patch(all=True)

import os, sys, time
from boto.s3.connection import S3Connection
from boto.s3.bucket import Bucket

import logging

logging.basicConfig(filename="s3_download.log", level=logging.INFO)


def download_file(key_name):
    # Its imp to download the key from a new connection
    conn = S3Connection("KEY", "SECRET")
    bucket = Bucket(connection=conn, name="BUCKET")
    key = bucket.get_key(key_name)

    try:
        res = key.get_contents_to_filename(key.name)
    except:
        logging.info(key.name+":"+"FAILED")

if __name__ == "__main__":
    conn = S3Connection("KEY", "SECRET")
    bucket = Bucket(connection=conn, name="BUCKET")

    logging.info("Fetching bucket list")
    bucket_list = bucket.list(prefix="PREFIX")

    logging.info("Creating a pool")
    pool = GreenPool(size=20)

    logging.info("Saving files in bucket...")
    for key in bucket.list():
        pool.spawn_n(download_file, key.key)
    pool.waitall()
于 2011-01-18T06:51:08.697 に答える
5

イベントレットを使用してI/O並列処理を行い、urllibを使用して1つのオブジェクトをダウンロードする簡単な関数を記述し、次にGreenPileを使用してそれを入力URLのリストにマップします。

于 2011-01-18T05:43:54.867 に答える