0

我有一个 python 脚本,它从亚马逊 S3 服务器下载 shell 脚本,然后执行它们(每个脚本的大小约为 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()

在所有线程中,只有一个线程成功,所有其他线程都因“文本文件繁忙错误”而失败。有人可以帮我弄清楚我做错了什么吗?

4

1 回答 1

0

Boto3 不是线程安全的,因此您无法在每次下载时重复使用 S3 连接。有关解决方法的详细信息,请参见此处

于 2015-09-30T10:35:13.687 回答