5

Celery で Django を使用して、連絡先/電子メールの解析に関連するバックグラウンドで 2 つのタスクを実行しています。

構造は次のとおりです。

project
   /api
   /core
       tasks.py
   settings.py

settings.py ファイルには以下が含まれます。

BROKER_URL = 'django://'
BROKER_BACKEND = "djkombu.transport.DatabaseTransport"

#celery
BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

sys.path.append(os.path.dirname(os.path.basename(__file__)))
CELERY_IMPORTS = ['project.core.tasks']

import djcelery
djcelery.setup_loader()

# ....

INSTALLED_APPS = (
    #...

    'kombu.transport.django',
    'djcelery',
)

tasks.py には以下が含まれます。

from celery.task import Task
from celery.registry import tasks

class ParseEmails(Task):
    #...

class ImportGMailContactsFromGoogleAccount(Task):
    #...

tasks.register(ParseEmails)
tasks.register(ImportGMailContactsFromGoogleAccount)

また、wsgi.py に追加

os.environ["CELERY_LOADER"] = "django"

現在、このアプリを WebFactional サーバーでホストしています。私のローカルホストではこれは問題なく動作しますが、Django アプリが Apache サーバーにデプロイされている WebFaction サーバーでは、次のようになります。

2013-01-23 17:25:00,067: ERROR/MainProcess] Task project.core.tasks.ImportGMailContactsFromGoogleAccount[df84e03f-9d22-44ed-a305-24c20407f87c] raised exception: Task of kind 'project.core.tasks.ImportGMailContactsFromGoogleAccount' is not registered, please make sure it's imported.

しかし、タスクは登録済みとして表示されます。私が走れば

python2.7 manage.py celeryd -l info

私は得る:

 -------------- celery@web303.webfaction.com v3.0.13 (Chiastic Slide)
---- **** ----- 
--- * ***  * -- [Configuration]
-- * - **** --- . broker:      django://localhost//
- ** ---------- . app:         default:0x1e55350 (djcelery.loaders.DjangoLoader)
- ** ---------- . concurrency: 8 (processes)
- ** ---------- . events:      OFF (enable -E to monitor this worker)
- ** ---------- 
- *** --- * --- [Queues]
-- ******* ---- . celery:      exchange:celery(direct) binding:celery
--- ***** ----- 

[Tasks]
  . project.core.tasks.ImportGMailContactsFromGoogleAccount
  . project.core.tasks.ParseEmails

相対的なインポート エラーである可能性があると思いましたが、settings.py と wsgi.py の変更によりそれが防止されると想定しました。

WebFactional でサポートされている複数の Python バージョンがこれに関係しているのではないかと考えていますが、Python 2.7 用のすべてのライブラリをインストールし、2.7 用の Django も実行しているので、問題はないはずです。

celeryd -l info を使用して localhost で実行すると、ワーカーを起動するとタスクもリストに表示されますが、タスクを呼び出してもエラーは出力されません。完全に実行されます。

ありがとうございました

4

1 に答える 1

1

新しい Ubuntu 12.04 / Apache / mod_wsgi / Django 1.5 / Celery 3.0.13 運用環境でも同じ問題が発生しました。Mac Os X 10.8 ラップトップと古いサーバー (Celery 3.0.12 を搭載) ではすべて正常に動作しますが、新しいサーバーでは動作しません。

Celery に問題があるようです: https://github.com/celery/celery/issues/1150

私の最初の解決策は、Task クラス ベースのタスクを @task デコレータ ベースに変更することでした。

class CreateInstancesTask(Task):
    def run(self, pk):
        management.call_command('create_instances', verbosity=0, pk=pk)
tasks.register(CreateInstancesTask)

このようなものに:

@task()
def create_instances_task(pk):
    management.call_command('create_instances', verbosity=0, pk=pk)

今、このタスクはうまくいっているようですが、もちろん、さらにテストを行う必要があります...

于 2013-02-05T09:02:42.167 に答える