31

我尝试过使用 Python + boto + 多处理、S3cmd 和 J3tset,但都在苦苦挣扎。

有什么建议,也许是您一直在使用的现成脚本或我不知道的其他方式?

编辑:

eventlet+boto 是一个值得的解决方案,如下所述。在这里找到了一篇很好的 eventlet 参考文章http://web.archive.org/web/20110520140439/http://teddziuba.com/2010/02/eventlet-asynchronous-io-for-g.html

我在下面添加了我现在正在使用的 python 脚本。

4

2 回答 2

35

好的,我根据@Matt Billenstien 的提示想出了一个解决方案。它使用 eventlet 库。第一步在这里是最重要的(标准 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

使用 eventlet 为您提供 I/O 并行性,编写一个简单的函数来使用 urllib 下载一个对象,然后使用 GreenPile 将其映射到输入 url 列表 - 一堆 50 到 100 个 greenlet 应该可以......

于 2011-01-18T05:43:54.867 回答