0

Amazon S3サーバーからシェルスクリプトをダウンロードして実行するpythonスクリプトがあります(各スクリプトのサイズは約3GBです)。ファイルをダウンロードして実行する関数は次のようになります。

import boto3

def parse_object_key(key):
    key_parts = key.split(':::')
    return key_parts[1]

def process_file(file):
    client = boto3.client('s3')
    node = parse_object_key(file)
    file_path = "/tmp/" + node + "/tmp.sh"
    os.makedirs(file_path)
    client.download_file('category', file, file_path)
    os.chmod(file_path, stat.S_IXUSR)
    os.system(file_path)

ノードはファイルごとに一意です。

これを実行するための for ループを作成しました。

s3 = boto3.resource('s3')
bucket = s3.Bucket('category')
for object in bucket.objects.page_size(count=50):
    process_file(object.key, client)

これは完全に機能しますが、ファイルごとに個別のスレッドを作成しようとすると、エラーが発生します。

sh: 1: /path/to/file: Text file busy

スレッド化されたスクリプトは次のようになります。

s3 = boto3.resource('s3')
bucket = s3.Bucket('category')
threads = []
for object in bucket.objects.page_size(count=50):
    t = threading.Thread(target=process_file, args=(object.key, client))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

すべてのスレッドのうち、1 つのスレッドだけが成功し、他のすべてのスレッドは「テキスト ファイル ビジー エラー」で失敗します。誰かが私が間違っていることを理解するのを手伝ってくれますか?

4

1 に答える 1

0

Boto3 はスレッドセーフではないため、ダウンロードごとに S3 接続を再利用することはできません。回避策の詳細については、こちらを参照してください。

于 2015-09-30T10:35:13.687 に答える