2

Django==1.5 の celery==3.0.23 にいくつか問題があります。

私は、RabbitMQ で Celery をメッセージ ブローカーとして使用して、Django プロジェクトで非同期タスクのキューを維持しています。これは、オンラインで実行するにはリモート サービスとのやり取りが多すぎるためです。

これが私のsettings.pyのdjango-celery構成です。INSTALLED_APPSタプルにもセロリとdjceleryがあります

import djcelery

BROKER_URL = 'amqp://guest:guest@localhost:5672'
CELERY_ROUTES = {
    'users.tasks.sync_messages': {'queue': 'cron'},
    'users.tasks.update_balance': {'queue': 'cron'},
    'profiles.tasks.*': {'queue': 'job'}
}

CELERYBEAT_SCHEDULE = {
    'sync-messages': {
        'task': 'users.tasks.sync_messages',
        'schedule': crontab(minute='*/4'),
    },
    'update-balance': {
        'task': 'users.tasks.update_balance',
        'schedule': crontab(minute='*/5'),
    },
}

(予定の仕事もあります)

私はprofiles.helpersでいくつかのメソッドを定義し、セロリのドキュメントで説明されているようにこのメソッドを呼び出します:

method.delay(arg1, arg2...)

UnicodeDecodeError が原因でジョブを拒否します

-l DEBUG オプションを指定して celeryd を実行しました。これは、ジョブをエンキューしようとしたときの出力です。

[2013-09-13 17:19:56,108: DEBUG/MainProcess] consumer: Ready to accept tasks!
[2013-09-13 17:21:13,970: WARNING/MainProcess] Traceback (most recent call last):
[2013-09-13 17:21:13,970: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 851, in emit
[2013-09-13 17:21:14,020: WARNING/MainProcess] msg = self.format(record)
[2013-09-13 17:21:14,021: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 724, in format
[2013-09-13 17:21:14,021: WARNING/MainProcess] return fmt.format(record)
[2013-09-13 17:21:14,021: WARNING/MainProcess] File "/home/israelord/.virtualenvs/ringtu/local/lib/python2.7/site-packages/celery/utils/log.py", line 110, in format
[2013-09-13 17:21:14,041: WARNING/MainProcess] return safe_str(logging.Formatter.format(self, record))
[2013-09-13 17:21:14,041: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 464, in format
[2013-09-13 17:21:14,041: WARNING/MainProcess] record.message = record.getMessage()
[2013-09-13 17:21:14,041: WARNING/MainProcess] File "/usr/lib/python2.7/logging/__init__.py", line 328, in getMessage
[2013-09-13 17:21:14,042: WARNING/MainProcess] msg = msg % self.args
[2013-09-13 17:21:14,042: WARNING/MainProcess] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 58: ordinal not in range(128)
[2013-09-13 17:21:14,042: WARNING/MainProcess] Logged from file consumer.py, line 589

ここにはあまり情報がないことは知っていますが、これをデバッグする方法がわかりません

Celery がタスクをシリアル化する方法に関係していると思いますが、いくつかのシリアライザーを試して同じ結果を得ました。いくつかのブログ投稿を読んでいて、これが Celery < 3.0 バージョンで非常に一般的な問題であり、それが解決されたことを発見しましたセロリ 3.0

誰かがこれについて私に光を当てることができますか?

時間を割いて読んで助けてくれてありがとう。

4

2 に答える 2

4

通常、Django クエリセット オブジェクトや User などの遅延評価されたオブジェクトを Celery タスクに渡すことは、適切にシリアル化されないため、お勧めできません。ユーザー名文字列を渡すだけで送信内容を簡素化し、セロリタスク内でそのユーザーのDBを再度クエリすることをお勧めします。

于 2013-09-25T17:05:20.643 に答える