1

Django バージョン 1.4.1 のシステムに celery==3.0.12 と djcelery==3.0.11 をインストールしました。プロジェクトの 1 つでセロリを使用していくつかのタスクを非同期的に処理しようとしましたが、機能していませんでした。テストのために、新しい django プロジェクトを開始し、サンプル タスクaddを定義して、このようにシェルから呼び出しました。

 >>>res = add.delay(3, 5)

を試しましres.statusたが、これらはすべてブロックされています。rabbitmq 管理プラグインを使用して、ブラウザーでrabbitmq キューを監視していました。キューはアイドル状態のままで、メッセージを受け取っていません。res.get()res.ready()celerycelery

以下はディレクトリツリーです。

|-- manage.py
|-- new_app
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- models.py
|   |-- models.pyc
|   |-- tasks.py
|   |-- tasks.pyc
|   |-- tests.py
|   `-- views.py
`-- testapp
    |-- __init__.py
    |-- __init__.pyc
    |-- settings.py
    |-- settings.pyc
    |-- urls.py
    `-- wsgi.py

以下はファイルの内容です

new_app/tasks.py

from celery import task

@task
def add(x ,y):
    return x + y

testapp/settings.py

import djcelery
djcelery.setup_loader()

BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'guest'
BROKER_PASSWORD = 'guest'
BROKER_VHOST = '/'

を実行していると、キューpython manage.py celeryd -l INFOが作成されます。celery以下はコンソール出力です。 http://dpaste.com/841960/

RabbitMQ のバージョンは 3.0.0 です

の出力rabbitmqctl list_queues

Listing queues ...
celery  0
h4ckb0x.celery.pidbox   0
...done.
4

1 に答える 1

0

あなたの行動を以下と比較して、あなたのアプリに欠けているものを見つけてください:

ウサギを構成します。

最初にインストールします(この場合はubuntu):

sudo apt-get update
sudo apt-get install rabbitmq-server
sudo mkdir /etc/rabbitmq/rabbitmq.conf.d

ユーザー/psw/仮想ホストを設定:

sudo rabbitmqctl delete_user guest
sudo rabbitmqctl add_user <username> <password>
sudo rabbitmqctl set_user_tags <username> administrator
sudo rabbitmqctl add_vhost <some_name_for_vhost>
sudo rabbitmqctl set_permissions -p <some_name_for_vhost> <username> ".*" ".*" ".*"')

設定を定義します。

設定.py

RABBIT_USERNAME = <username>
RABBIT_PASSWORD = <password>
RABBIT_HOST = 'localhost' #or some server dns/ip
RABBIT_VHOST = <some_name_for_vhost>
BROKER_URL = 'amqp://%s:%s@%s:5672/%s' % (RABBIT_USERNAME,RABBIT_PASSWORD,RABBIT_HOST,RABBIT_VHOST)

CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'
CELERY_ENABLE_UTC = True
CELERY_CREATE_MISSING_QUEUES = True

セロリの定義:

セロリ.py

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'yourapp.settings')

app = Celery('yourapp')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

タスクを定義します。

タスク.py

from celery import task

@task(queue="my_queue")
def do_something_in_background(x1,x2):   
    #start doing something in the task
    #enter you code in here

ワーカーを実行します。

(既存のすべてを適切に削除し、app_worker という名前の 10 個のワーカーを実行し、それらをタスク キュー: my_queue に接続します)

run_workers.sh

#!/bin/bash
ps auxww | grep 'yourapp worker' | awk '{print $2}' | xargs kill
celery -A yourapp worker -Q my_queue -n app_worker -l info -c 10 -Ofair

いくつかのテストを定義します:

test.py

import tasks
def my_func():
    tasks.do_something_in_background.delay(x1,x2)
于 2014-11-11T22:33:13.843 に答える