【问题标题】:Boto reverse the stream博托反转流
【发布时间】:2012-10-03 18:54:27
【问题描述】:

我有一个文件被上传到的服务器,我希望能够使用 boto 将这些文件转发到 s3,我必须在数据上传到 s3 时对数据进行一些处理。

我遇到的问题是他们上传的方式我需要提供一个可写流,传入数据被写入并上传到 boto 我需要一个可读流。所以就像我有两个不连接的末端。有没有办法用可写流上传到 s3?如果是这样,那将很容易,我可以将上传流传递给 s3,它的执行将链接在一起。

如果没有我有两个松散的末端,我需要在它们之间使用某种缓冲区,它可以从上传中读取以保持移动,并公开一个我可以提供给 boto 的读取方法,以便可以读。但是这样做我确定我需要线程化 s3 上传部分,因为我使用的是扭曲的,所以我宁愿避免这样做。

我觉得我已经把事情复杂化了,但我想不出一个简单的解决方案。这必须是一个常见的问题,我只是不知道如何把它用词很好地搜索它

【问题讨论】:

    标签: python stream twisted boto


    【解决方案1】:

    boto 是一个带有阻塞 API 的 Python 库。这意味着您必须使用线程来使用它,同时维护 Twisted 为您提供的并发操作(就像您在使用 boto ''without'' Twisted 时必须使用线程来获得任何并发性一样;即,Twisted 没有帮助使 boto 非阻塞或并发)。

    相反,您可以使用 txAWS,这是一个面向 Twisted 的库,用于与 AWS 进行交互。 txaws.s3.client 提供了与 S3 交互的方法。如果您熟悉 boto 或 AWS,其中一些应该已经很熟悉了。例如,create_bucketput_object

    如果 txAWS 提供流式 API 会更好,这样您就可以在文件上传给您时上传到 S3。我认为这目前正在开发中(基于 Twisted 中的新 HTTP 客户端,twisted.web.client.Agent),但可能尚未发布。

    【讨论】:

    • 如果您可以将可写流写入 s3,那么您就不需要线程化它我很确定,您可以一次写入一个块并将其分解。关于 txawx 的好点,我会研究一下
    • 获取可写流很容易——创建一个 StringIO 或在磁盘上打开一个真实文件。如果 S3 接受数据的速度不如您接受数据的速度,那么您遇到的困难是缓冲区的大小。
    • 该缓冲区将停止执行链,因此 s3 部分将需要在线程中。如果在 s3 部分有写入,进入 s3 并发送该位数据,然后执行退出,这一切都可以在扭曲的单个线程中以异步方式完成
    • "该缓冲区将停止执行链,因此 s3 部分将需要在线程中。" - 仅当您使用 boto 而不是 txaws 时。我不确定我是否理解您的其余评论。一些具体的代码可能会使问题更清楚。
    • S3 服务不支持真正的流式上传(即分块传输编码),因此无论您使用哪个客户端,您都需要始终知道要放入 S3 的数据的内容长度正在使用。
    【解决方案2】:

    您只需将流包装在像对象这样的文件中。所以本质上,流对象应该有一个 read 方法,该方法会阻塞直到文件完全上传。

    之后您只需使用 s3 API

    bucketname = 'my_bucket'
    conn = create_storage_connection()
    buckets = conn.get_all_buckets()
    bucket = None
    for b in buckets:
        if b.name == bucketname:
            bucket = b
    if not bucket:
        raise Exception('Bucket with name ' + bucketname + ' not found')
    k = Key(bucket)
    k.key = key
    k.set_contents_from_filename(MyFileLikeStream)
    

    【讨论】:

    • 您的代码似乎没有解释任何与问题相关的内容,也没有解释您在文本中的答案。除最后一行外的所有行似乎都无关紧要,最后一行缺少有关 MyFileLikeStream 的任何解释,我猜这是错误的(您可能应该使用 k.set_contents_from_file,而不是 .._from_filename)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-23
    • 2018-02-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多