【发布时间】:2011-07-23 21:10:57
【问题描述】:
我正在将 Django 与 MongoEngine、django-celery 和用于 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
当它运行任务时,celery 会这样说
[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)
convert 调用了许多其他函数。基本上,它首先从 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
知道可能出了什么问题吗?
【问题讨论】:
-
我想看到
convert的代码可能会更加启发这个案例...... -
我最终只是将文件与图像文档一起存储,而不是通过 FileField 与 gridfs 一起存储。有帮助的一件事是将调用转移到任务而不是导入函数,因为当它们在导入函数中时,有时会默默地失败。最终,我收到一条错误消息,提示 FileField.put 期望我传递编码,这没有意义。
标签: django mongodb celery django-celery mongoengine