"文本文件繁忙"多线程python上的错误

时间:2015-09-30 09:47:36

标签: python amazon-s3 boto3

我有一个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()

在所有线程中,正好一个线程成功,所有其他线程失败"文本文件繁忙错误"。有人能帮我弄清楚我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

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