4

私は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

何がうまくいかないかについて何か考えはありますか?

4

1 に答える 1

2

更新:あなたが抱えていた問題についてもう少し考えてみました。解決したように聞こえますが、誰かが同様の問題を抱えている場合に備えて、いくつかのメモを追加します.

Mongodb は JSON を明示的に展開し、代わりに 'BSON' を使用します。これにより、サポートされている型のリストにバイナリとファイルの型が追加されます。セロリのドキュメントで「JSON」しか見たことがないので、セロリでmongodbを使用して拡張セットを処理するには、画像を使用しているように聞こえるので注意が必要だと思います。

IPYTHON の最新の開発バージョン (11.0rc4) のドキュメントでは、分散作業システムについて説明しています。専門用語はセロリに似ていますが、バックエンドはまったく異なる場合があります。セロリはバックエンドに関して比較的柔軟であり、おそらくより多くのセキュリティを可能にすると思います。これは、ipython が必要とする zeromq の問題のように聞こえます。しかし、データベース側では、ドキュメントによると、ipython システムは「mongodb を中心にゼロから設計された」ものであり、bson は完全にサポートされています。したがって、セロリの他の機能 (セキュリティ、django に関連する開発ベースなど) にあまり関心がない場合は、検討してみてください。繰り返しますが、これは celery と ipython の両方に値する厳密な評価ではありません。ipython は、他の科学計算ライブラリともうまく統合できます。

幸運を祈ります

元の回答: 私は lazerscience に同意します。ここでより多くのコンテキストを取得すると役立ちます。これらのライブラリは複雑であるため、不明な点が非常に多くあります。このサイトで期待される厳密さで答えることはおそらく不可能です。

とはいえ、シリアル化の問題に遭遇した可能性があると思います。Celery では、選択した実装に応じて、オブジェクトが pickleable であるか、少なくともシリアル化可能である必要があります (JSON もサポートしていることは知っていますが、Pickle と JSON が完全に重複しているかどうかはわかりません)。あなたの関数は整数パラメータしかとらないことがわかりました。これは良いことです。しかし、gridfs への移行は、画像をピクルしようとしているということでしょうか? 確かにセロリで画像を操作できますが、特に不思議な「変換」関数の背後で起こっているすべてのことで、Unicode、辞書、整数、浮動小数点数など以外のものを誤ってシリアル化しようとしている可能性があるかどうかはわかりませんあなたのフォーマットがサポートするその他のいくつかのオブジェクト。たぶんあなた'

私がベースから外れている場合は、少したるみをカットしてください。ここと mongoengine ユーザーのグループの両方であなたのメッセージを見て、あなたが立ち往生していて、より専門的な意見が見つからないと思ったので、私は返信しています. また、バックエンド ソフトウェアの妥当な最新バージョンがあることを再確認することもできます。ある時点で奇妙なセロリの問題がたくさんありましたが、rabbitmq を更新したときに主に解決されたことがわかりました。幸運を!

于 2011-07-28T15:19:59.297 に答える