除了写入数据库之外,Celery任务似乎做了所有事情

时间:2011-07-23 21:10:57

标签: django mongodb celery django-celery mongoengine

我正在使用Django与MongoEngine,django-celery和MongoDB后端用于芹菜。我正在排队一项任务。该任务涉及从GridFS(通过MongoEngine FileField)获取文件,对其进行操作并将其放回数据库中。

任务按照我的预期运行而不排队。当我对它进行排队时,它会转换文件,但不会写入数据库。

这是我的settings.py的相关部分。

#These are apparently defaults that I shouldn't need
BROKER_BACKEND = 'mongodb'
BROKER_HOST = "localhost"
BROKER_PORT = 27017
BROKER_USER = ""
BROKER_PASSWORD = ""
BROKER_VHOST = ""

CELERY_RESULT_BACKEND = "mongodb" CELERY_MONGODB_BACKEND_SETTINGS = {
    "host": "localhost",
    "port": 27017,
    "database": "svg",
    "taskmeta_collection": "taskmeta", }

import djcelery djcelery.setup_loader()

我正在像这样经营芹菜

 $ ./manage.py celeryd -l info

当它执行任务时,芹菜说这个

[2011-07-23 16:07:11,858: INFO/MainProcess] Got task from broker: graphics.tasks.queue_convert[dfdf98ad-0669-4027-866d-c64971bb6480]
[2011-07-23 16:07:15,196: INFO/MainProcess] Task graphics.tasks.queue_convert[dfdf98ad-0669-4027-866d-c64971bb6480] succeeded in 3.33006596565s

(没有错误)

这是任务。

@task()
def queue_convert(imageId):
    image=Image.objects.get(id=imageId)
    convert(image)

转换调用一堆其他函数。基本上,它首先从FileField读取,操作该字符串,将该字符串写入文件,操作该文件,将生成的字符串和文件写入其他FileField,然后运行image.save()。

根据我是否对任务进行排队,mongo日志看起来有所不同。这是我在使用任务队列时在mongo日志中发生的事情。

Sat Jul 23 16:03:26 [initandlisten] connection accepted from 127.0.0.1:39065 #801
Sat Jul 23 16:03:26 [initandlisten] connection accepted from 127.0.0.1:39066 #802
Sat Jul 23 16:03:29 [initandlisten] connection accepted from 127.0.0.1:39068 #803

当我直接调用convert(image)而不是调用queue_convert(image.id)时会发生这种情况

Sat Jul 23 16:07:13 [conn807] end connection 127.0.0.1:43630
Sat Jul 23 16:07:13 [initandlisten] connection accepted from 127.0.0.1:43633 #808
Sat Jul 23 16:07:13 [initandlisten] connection accepted from 127.0.0.1:43634 #809
Sat Jul 23 16:07:13 [conn808] end connection 127.0.0.1:43633

有什么可能出错的想法吗?

1 个答案:

答案 0 :(得分:2)

更新:我已经考虑过你遇到的问题,虽然听起来你已经为你解决了这个问题,但是如果有人遇到类似问题,我会添加几个笔记。

Mongodb显式扩展了JSON,改为使用'BSON',它将二进制和文件类型添加到支持的类型列表中。我只是在芹菜文档中看过'JSON',所以我猜想使用mongodb和芹菜并处理扩展的集合需要小心,因为它听起来像是你的图像。

在最新开发版IPYTHON(11.0rc4)的文档中,他们讨论了他们的分布式工作系统。虽然术语听起来与芹菜类似,但后端可能完全不同。我认为芹菜对后端相对灵活,并且可能允许更高的安全性,这听起来像zeromq的问题,这是ipython需要的。但是在数据库方面,ipython系统是“从mongodb开始设计的”,根据文档,并且bson完全支持。因此,如果你不太关心其他celery功能(安全性,与django相关的开发基础,当然还有更多),你可能会考虑它。同样,这绝不是芹菜和ipython都应该得到的严格评价,只是可能的领先; ipython还与其他科学计算库很好地集成,内置对matplotlib的支持,以及许多科学计算示例,如果您正在进行图像处理并将图像数据视为numpy数组或其他任何内容,您可能会对此感兴趣。

祝你好运

原始答案: 我同意lazerscience - 这将有助于在这里有更多的背景。由于这些库的复杂性,有许多未知数。可能无法回答本网站预期的严谨性。

那就是说,我认为你可能遇到了序列化问题。 Celery要求您的对象可以选择,或者至少可以根据您选择的任何实现进行序列化(我知道它们也支持JSON,但我不足以确定Pickle和JSON是否完全重叠)。我看到你的函数只接受一个整数参数,这很好。但转向gridfs是否意味着你试图腌制图像?你当然可以用芹菜操纵图像,但我不确定,尤其是在神秘的“转换”功能背后发生的一切,无论你是否偶然地尝试序列化除了unicode,字典,整数,浮点数等之外的东西。您的格式支持的其他几个杂项对象。也许你过去在图像中检索了一个文件路径并在文件中对其进行了操作,而没有检索或发送超过unicode,现在有图像本身?

如果我离开基地,请给我一点松懈。我正在回应,因为我在这里以及mongoengine用户组中看到了你的消息,并且发现你被卡住而没有找到更专业的意见。您也可以仔细检查以确保您拥有合理的当前版本的后端软件。我在某些时候遇到了一堆奇怪的芹菜问题,发现当我更新rabbitmq时它们主要得到了解决。祝你好运!