我有一个在Elastic Beanstalk上运行的芹菜工作者,它轮询SQS队列,获取消息(包含S3文件名),从S3下载这些文件并处理它们。我的工作人员计划每15秒运行一次,但由于某种原因,内存使用量会随着时间的推移而不断增加。
这是我用来访问SQS的代码
def get_messages_from_sqs(queue_url, queue_region="us-west-2", number_of_messages=1):
client = boto3.client('sqs', region_name=queue_region)
sqs_response = client.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=number_of_messages)
messages = sqs_response.get("Messages", [])
cleaned_messages = []
for message in messages:
body = json.loads(message["Body"])
data = body["Records"][0]
data["receipt_handle"] = message["ReceiptHandle"]
cleaned_messages.append(data)
return cleaned_messages
def download_file_from_s3(bucket_name, filename):
s3_client = boto3.client('s3')
s3_client.download_file(bucket_name, filename, '/tmp/{}'.format(filename))
答案 0 :(得分:1)
我在生产中使用Celery遇到了类似的问题,与Boto完全无关。尽管我没有内存泄漏的解释(这将导致一些严重的代码泄漏和性能分析),但是如果您的目标只是不耗尽内存,我可以提供一种可能的解决方法。
设置max tasks per child应该可以让您不断回收被终止进程释放的内存。