将大文件传递给 Celery 进行处理不起作用



我想将文件保存到 AWS S3,并且正在使用 Celery,因为我不想等到函数完成文件写入。问题是当我将其发送到 Celery 函数时,我可以看到与实际文件大小相比,我的 AWS 文件存储中的大小不同。

这是我将其发送到芹菜功能时:

file_to_put = str(file_to_put) # because you can't send an object to celery fun
write_file_aws.delay(file_full_name, file_to_put)

芹菜函数本身:

@celery.task(name="write_file_to_aws")
def write_file_aws(file_full_name, file_to_put):
file_to_put = bytearray(file_to_put)
s3 = boto3.resource('s3')
s3.Object(BUCKET, file_full_name).put(Body=file_to_put)
return "Request sent!"

这是当文件大小小于应有的大小时(例如,图片中的 1kb 而不是 22kb 甚至是 710kb 而不是 230(,并且文件本身只是胡言乱语。为什么会这样?是因为我把它变成了string吗?如果是,我还能做什么?

您正在序列化一个大文件并将其作为参数传递给函数。 我假设您使用的是EC2。因此,您可以先将文件存储到 AWS EC2 的实例存储或 EBS 中(它们写入 S3 的速度更快(。然后将此文件的"路径"作为参数传递给 Celery 函数调用。然后,Celery 工作线程会将文件复制到 S3。

即:

def write_file_aws(file_full_name, file_to_put)

将成为:

def write_file_aws(file_full_name, path_to_local_file)

以下是有关 AWS EC2 存储选项的入门知识:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html

出于正当理由(简而言之 - 任务参数存储在后端内存中,如果对象很大,则可能会导致内存错误(,您无法将大型对象传递给 Celery 任务。相反,您将引用传递给 Celery 任务可以访问该大型对象的任何位置。如果它是一个文件,那么把它放在一个共享文件系统(例如NFS(上,所有Celery节点都可以访问,并传递文件名(如果这样更容易的话,可能还有一个路径(。

相关内容

  • 没有找到相关文章

最新更新