私はDjangoをMongoEngine、django-celery、およびセロリ用のMongoDBバックエンドで使用しています。1つのタスクをキューに入れています。このタスクには、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)
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
これは、queue_convert(image.id)を呼び出す代わりにconvert(image)を直接呼び出すとどうなりますか。
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
何がうまくいかないかについて何か考えはありますか?