celery任务调用了三次,但提供给该任务的数据没有更改

368yc8dk  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(388)

我有一个文档模型,其中有一个用于上传图像、PDF等的文件字段,还有一个用于从单个上传文件创建的八种不同大小图像的imagefields。我用枕头把上传的图片转换成8种不同的大小。我允许在documentadmin中上载多个文件,在save\ model中,我创建一个缩略图和一个大图像以显示在documentadmin页面中,然后使用celery 任务(使用redis)在后台创建其他不同大小的图像,并将它们保存到文档模型中。
我的代码正确地创建了不同的图像,但是我在celery 任务中遇到了一个奇怪的情况。celery 任务使用相同的代码来创建不同大小的图像,就像save\u model中用于创建拇指和大图像的代码一样。
save\ U型号代码的相关部分:

def save_model(self, request, obj, form, change):
    if form.is_valid():
        if not change:
            # Uploading one or more images
            files = request.FILES.getlist('storage_file_name')
            if files:
                for f in files:
                    with transaction.atomic():
                        original_file_name, extension = os.path.splitext(f.name)
                        new_file_name = original_file_name + "." + settings.DEFAULT_IMAGE_EXTENSION
                        obj2 = Document()
                        # save the original file
                        if extension.lower() == ".pdf":
                        obj2.pdf_file = f
                        else:
                            obj2.storage_file_name = f
                        save_document_images(obj2, new_file_name, image_file=f, rot_angle=0, thumbnail=True, xsmall=False, small=False, medium=False, large=True, xlarge=False, xxlarge=False, xxxlarge=False)
                        obj2.save()
                        logger.debug("Starting transaction for document-id=%s, new_file_name=%s" % (obj2.document_id, new_file_name))
                        transaction.on_commit(lambda: tasks.create_additional_images_task.apply_async(args=[obj2.document_id, new_file_name,], kwargs={'rot_angle':0, 'thumbnail': False, 'xsmall':True, 'small':True, 'medium':True, 'large':False, 'xlarge':True, 'xxlarge':True, 'xxxlarge':True}))

celery 任务的代码:

@app.task(bind=True)
def create_additional_images_task(self, *args,**kwargs):
    from memorabilia.models import Document
    obj2 = Document.objects.get(document_id=args[0])
    image_file = obj2.storage_file_name
    clogger.debug("document_id=%s, obj2=%s, new_file_name=%s, image_file=%s" % (args[0], obj2, args[1], image_file.name))
    for key in kwargs:
        clogger.debug("kwargs: key=%s, value=%s" % (key, kwargs[key]))
    save_document_images(obj2, args[1], image_file, kwargs['rot_angle'], kwargs['thumbnail'], kwargs['xsmall'], kwargs['small'], kwargs['medium'], kwargs['large'], kwargs['xlarge'], kwargs['xxlarge'], kwargs['xxxlarge'])

例如,我上传了三张不同的图片。当我查看django日志时,我看到celery 任务被调用了三次,使用了三个不同的文档ID和图像名称:

[2020-04-19 17:10:18] DEBUG [memorabilia.admin.save_model:1739] Starting transaction for document-id=110, new_file_name=image-1.jpg
[2020-04-19 17:10:19] DEBUG [memorabilia.admin.save_model:1739] Starting transaction for document-id=111, new_file_name=image-2.jpg
[2020-04-19 17:10:20] DEBUG [memorabilia.admin.save_model:1739] Starting transaction for document-id=112, new_file_name=image-3.jpg

当我看celery 日志时,我看到以下内容:

[2020-04-19 17:10:20,665: INFO/MainProcess] Received task: memorabilia.tasks.create_additional_images_task[ec7699d8-7b73-4004-bb78-9371bcf0e1d6]  
[2020-04-19 17:10:20,666: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x7f85ce09ae18> (args:('memorabilia.tasks.create_additional_images_task', 'ec7699d8-7b73-4004-bb78-9371bcf0e1d6', {'lang': 'py', 'task': 'memorabilia.tasks.create_additional_images_task', 'id': 'ec7699d8-7b73-4004-bb78-9371bcf0e1d6', 'shadow': None, 'eta': None, 'expires': None, 'group': None, 'retries': 0, 'timelimit': [None, None], 'root_id': 'ec7699d8-7b73-4004-bb78-9371bcf0e1d6', 'parent_id': None, 'argsrepr': "[112, 'image-3.jpg']", 'kwargsrepr': "{'rot_angle': 0, 'thumbnail': False, 'xsmall': True, 'small': True, 'medium': True, 'large': False, 'xlarge': True, 'xxlarge': True, 'xxxlarge': True}", 'origin': 'gen18286@tsunami', 'reply_to': '9dc88644-e203-30ff-a643-a14314f2572a', 'correlation_id': 'ec7699d8-7b73-4004-bb78-9371bcf0e1d6', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}}, b'[[112, "image-3.jpg"], {"rot_angle": 0, "thumbnail": false, "xsmall": true, "small": true, "medium": true, "large": false, "xlarge": true, "xxlarge": true, "xxxlarge": true}, {"callbacks": null,... kwargs:{})

[2020-04-19 17:10:20,667: INFO/MainProcess] Received task: memorabilia.tasks.create_additional_images_task[eeb2ac99-ae1f-4530-9e41-fe923cfba912]  
[2020-04-19 17:10:20,667: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x7f85ce09ae18> (args:('memorabilia.tasks.create_additional_images_task', 'eeb2ac99-ae1f-4530-9e41-fe923cfba912', {'lang': 'py', 'task': 'memorabilia.tasks.create_additional_images_task', 'id': 'eeb2ac99-ae1f-4530-9e41-fe923cfba912', 'shadow': None, 'eta': None, 'expires': None, 'group': None, 'retries': 0, 'timelimit': [None, None], 'root_id': 'eeb2ac99-ae1f-4530-9e41-fe923cfba912', 'parent_id': None, 'argsrepr': "[112, 'image-3.jpg']", 'kwargsrepr': "{'rot_angle': 0, 'thumbnail': False, 'xsmall': True, 'small': True, 'medium': True, 'large': False, 'xlarge': True, 'xxlarge': True, 'xxxlarge': True}", 'origin': 'gen18286@tsunami', 'reply_to': '9dc88644-e203-30ff-a643-a14314f2572a', 'correlation_id': 'eeb2ac99-ae1f-4530-9e41-fe923cfba912', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}}, b'[[112, "image-3.jpg"], {"rot_angle": 0, "thumbnail": false, "xsmall": true, "small": true, "medium": true, "large": false, "xlarge": true, "xxlarge": true, "xxxlarge": true}, {"callbacks": null,... kwargs:{})

[2020-04-19 17:10:20,668: INFO/MainProcess] Received task: memorabilia.tasks.create_additional_images_task[04cb7f54-285d-4e0f-86e0-aaa2995d1cb4]  
[2020-04-19 17:10:20,669: DEBUG/MainProcess] TaskPool: Apply <function _fast_trace_task at 0x7f85ce09ae18> (args:('memorabilia.tasks.create_additional_images_task', '04cb7f54-285d-4e0f-86e0-aaa2995d1cb4', {'lang': 'py', 'task': 'memorabilia.tasks.create_additional_images_task', 'id': '04cb7f54-285d-4e0f-86e0-aaa2995d1cb4', 'shadow': None, 'eta': None, 'expires': None, 'group': None, 'retries': 0, 'timelimit': [None, None], 'root_id': '04cb7f54-285d-4e0f-86e0-aaa2995d1cb4', 'parent_id': None, 'argsrepr': "[112, 'image-3.jpg']", 'kwargsrepr': "{'rot_angle': 0, 'thumbnail': False, 'xsmall': True, 'small': True, 'medium': True, 'large': False, 'xlarge': True, 'xxlarge': True, 'xxxlarge': True}", 'origin': 'gen18286@tsunami', 'reply_to': '9dc88644-e203-30ff-a643-a14314f2572a', 'correlation_id': '04cb7f54-285d-4e0f-86e0-aaa2995d1cb4', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}}, b'[[112, "image-3.jpg"], {"rot_angle": 0, "thumbnail": false, "xsmall": true, "small": true, "medium": true, "large": false, "xlarge": true, "xxlarge": true, "xxxlarge": true}, {"callbacks": null,... kwargs:{})

创建了三个任务(1d6、912、cb4-使用任务id的最后三位数字)。但是,这三个任务的参数都是,[112,“image-3.jpg”](document\u id=112,file\u name=image-3jpg)当我查看文件系统时,我看到celery 任务应该为文档\u id 110和111生成的图像还没有生成,但是为文档\u id 112生成的图像已经生成。所有三个文档ID的缩略图和大图像都已创建,因此生成图像的代码似乎正在运行。
我在代码中做错了什么?我必须承认,这是我第一次尝试用celery ,所以我有点迷路了。
谢谢!
作记号

tcomlyy6

tcomlyy61#

1) 我想你在用 on_commit 不恰当的。根据文件记载应该是这样的

for f in files:
    with transaction.atomic():
        transaction.on_commit(...)

否则django怎么知道那些是哪个交易 on_commit 地址是?所以您添加了三个图像,保存它们,这就是一个有三个侦听器的事务。
2) 请不要使用相同的 importfor 声明。先把它移高一点 for

相关问题