1

技術スタックは次のようになります。

  • Django フロントエンドとバックエンド
  • 時間のかかるタスクを非同期に処理するための Celery ワーカー キュー

ここ 1、2 日で、ローカルと本番環境の両方で、このような種類のスタック トレースが多数あることに気付きました。

[2012-07-05 20:31:01,583: CRITICAL/MainProcess] Task site_endpoint.tasks.async_inbound_message[a950736c-ff93-420c-9fbf-6deb2b88ff4d] INTERNAL ERROR: TypeError('__init__() takes at least 3 arguments (1 given)',)
Traceback (most recent call last):
  File "/projects/site/venv/lib/python2.7/site-packages/celery/execute/trace.py", line 192, in trace_task
    R = I.handle_error_state(task, eager=eager)
  File "/projects/site/venv/lib/python2.7/site-packages/celery/execute/trace.py", line 91, in handle_error_state
    }[self.state](task, store_errors=store_errors)
  File "/projects/site/venv/lib/python2.7/site-packages/celery/execute/trace.py", line 114, in handle_failure
    task.backend.mark_as_failure(req.id, exc, self.strtb)
  File "/projects/site/venv/lib/python2.7/site-packages/celery/backends/base.py", line 96, in mark_as_failure
    traceback=traceback)
  File "/projects/site/venv/lib/python2.7/site-packages/celery/backends/base.py", line 229, in store_result
    return self._store_result(task_id, result, status, traceback, **kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/djcelery/backends/database.py", line 26, in _store_result
    traceback=traceback)
  File "/projects/site/venv/lib/python2.7/site-packages/djcelery/managers.py", line 40, in _inner
    return fun(*args, **kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/djcelery/managers.py", line 164, in store_result
    "traceback": traceback})
  File "/projects/site/venv/lib/python2.7/site-packages/djcelery/managers.py", line 82, in update_or_create
    return self.get_query_set().update_or_create(**kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/djcelery/managers.py", line 66, in update_or_create
    obj, created = self.get_or_create(**kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/query.py", line 385, in get_or_create
    obj.save(force_insert=True, using=self.db)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/base.py", line 460, in save
    self.save_base(using=using, force_insert=force_insert, force_update=force_update)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/base.py", line 543, in save_base
    for f in meta.local_fields if not isinstance(f, AutoField)]
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/fields/subclassing.py", line 28, in inner
    return func(*args, **kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/fields/subclassing.py", line 28, in inner
    return func(*args, **kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 276, in get_db_prep_save
    return self.get_db_prep_value(value, connection=connection, prepared=False)
  File "/projects/site/venv/lib/python2.7/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
    return func(*args, **kwargs)
  File "/projects/site/venv/lib/python2.7/site-packages/picklefield/fields.py", line 154, in get_db_prep_value
    value = force_unicode(dbsafe_encode(value, self.compress, self.protocol))
  File "/projects/site/venv/lib/python2.7/site-packages/picklefield/fields.py", line 57, in dbsafe_encode
    value = b64encode(dumps(deepcopy(value), pickle_protocol))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 328, in _reconstruct
    args = deepcopy(args, memo)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 163, in deepcopy
    y = copier(x, memo)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 237, in _deepcopy_tuple
    y.append(deepcopy(a, memo))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 190, in deepcopy
    y = _reconstruct(x, rv, 1, memo)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy.py", line 329, in _reconstruct
    y = callable(*args)
TypeError: __init__() takes at least 3 arguments (1 given)

これが発生したときのデータベース呼び出しを見ると、次のクエリが実行されていることがわかります。

LOG:  statement: SELECT "celery_taskmeta"."id", "celery_taskmeta"."task_id", "celery_taskmeta"."status", "celery_taskmeta"."result", "celery_taskmeta"."date_done", "celery_taskmeta"."traceback" FROM "celery_taskmeta" WHERE "celery_taskmeta"."task_id" = 'a950736c-ff93-420c-9fbf-6deb2b88ff4d' 
LOG:  statement: SAVEPOINT s140735259576672_x4
LOG:  statement: ROLLBACK
LOG:  statement: BEGIN
LOG:  statement: SELECT "celery_taskmeta"."id", "celery_taskmeta"."task_id", "celery_taskmeta"."status", "celery_taskmeta"."result", "celery_taskmeta"."date_done", "celery_taskmeta"."traceback" FROM "celery_taskmeta" WHERE "celery_taskmeta"."task_id" = 'a950736c-ff93-420c-9fbf-6deb2b88ff4d' 
LOG:  statement: SAVEPOINT s140735259576672_x5
LOG:  statement: ROLLBACK
LOG:  statement: BEGIN
LOG:  statement: SELECT "celery_taskmeta"."id", "celery_taskmeta"."task_id", "celery_taskmeta"."status", "celery_taskmeta"."result", "celery_taskmeta"."date_done", "celery_taskmeta"."traceback" FROM "celery_taskmeta" WHERE "celery_taskmeta"."task_id" = 'a950736c-ff93-420c-9fbf-6deb2b88ff4d' 
LOG:  statement: SAVEPOINT s140735259576672_x6

この無効なオブジェクトの初期化の原因を理解するのに苦労しています。誰にもアイデアがありますか?

4

2 に答える 2

0

new-relic リモート パフォーマンス モニタリング/フォレンジック分析を使用しているようです。古いバージョンのライブラリが使用されているときに、この種の問題を見たことがあります。最新バージョンのクライアント ライブラリを使用していることを確認することをお勧めします。

于 2012-07-06T04:44:46.333 に答える
0

これは私に起こったので、Python multiprocessing pool hangs at join? を読んで解決しましたか? およびhttp://bugs.python.org/issue9400

問題:

セロリはどういうわけか、取得した例外をピクルしてどこかに送信します(データベース/ブローカーに、と思います)。そのため、Celery タスクが pickle 化できない例外を発生させると、いつでもこのバグが発生します。

ソリューション:

Celery タスク コードで発生する可能性があるすべての奇妙な例外を処理していることを確認する必要があります。はTracebackヒントを与えることができますが、すべてについて正確ではない場合があります。

例外がどこから来ているのかわからない場合は、タスク コードをtry...except: passブロック内に配置してみてください。

于 2013-11-05T02:31:51.337 に答える