Djangoのcelery構成(タイミングタスク、キューを含む)

8139 ワード

一、celeryのインストール
Djangoプロジェクトはceleryというパッケージをインストールする必要はありません.django-celeryというパッケージを直接使用して、まずインストールして、端末に入力します.
pip install django-celery

二、rabbitmqをインストールし、celeryキューを確立する
私が作ったプロジェクトはrabbitmqを使っています.道理から言えば、redisをメッセージキューとして使うこともできますが、rabbitmqのほうがいいです.ここでは詳しく説明しないで、興味のある学生は研究することができます.ubuntu環境で、端末に次のように入力します.
sudo apt-get install rabbitmq-server

三、設定settings.py
まずはINSTALLED_APPSにdjceleryへの参照を追加
INSTALLED_APPS = [
    'decelery',
]

またsettings.pyに次のコードを追加
import djcelery
djcelery.setup_loader()

BROKER_URL = 'amqp://guest:guest@localhost:5672/'
CELERY_RESULT_BACKEND = 'amqp'
CELERY_IMPORTS = (
    "common.tasks.task1",
    "common.tasks.task2",
)

四、celery非同期タスクの追加
common/tasks/task 1.pyに次のコードを追加すると、celery非同期タスクが定義されます.celeryタスクが多い可能性があるため、管理を容易にするために、プロジェクトの下のcommon/tasksフォルダにtaskをたくさん作成しました.pyファイル、例えばtask 1.py、task2.pyなど.task 1.pyに次のコードを追加します.
from celery.task import task

@task
def function1(a, b):
    print a + b

このceleryタスクを実行できるようにするにはsettingsでなければならないことに注意してください.pyに構成を追加します.これは上に追加されています.ここで特に注意してください.以下のようにします.
# common、tasks    ,task1、task2 tasks      py  
# CELERY_IMPORTS:         
CELERY_IMPORTS = (
    "common.tasks.task1",
    "common.tasks.task2",
)

この非同期タスクを呼び出すには
from common.tasks.task1 import function

function.delay(a, b)

便利ではないでしょうか.ツールの利点は、物事を簡単にすることですが、ツールに依存しすぎて、底の原理が分からないと人を馬鹿にしやすくなります.たとえば、threadingを使用して新しいスレッドを作成して非同期タスクを実行することもできます.ここでは説明しません.そうしないと、長い議論になります.興味のある子供靴はthreadingライブラリの使い方を学ぶことができます.
五、celeryを起動する
私たちがここで使っているのはdjango-celeryで、celeryというライブラリを直接使うのではなく、celeryを起動するコマンドはceleryの公式サイトで紹介されているのとは違い、新人がこれで穴に落ちる可能性が高いので、ここで特に注意します.端末コマンドは次のとおりです.
#       
python manage.py runserver
#    worker(--concurrency=2  4 worker  ,       ,                   )
python manage.py celery worker --concurrency=2 -l info

六、celeryタイミングタスクの構成
プロジェクトでは、以上の非同期タスクだけでなく、多くのタイミングタスクを作成する必要がある場合があります.これにより、celeryはまた活躍できます.settings.pyに次の構成を追加すると、タイミングタスクを追加できます.
from celery.schedules import crontab

#    common tasks      
# function2、function3   tasks     task1.py、task2.py         
CELERYBEAT_SCHEDULE = {
    'function2': {
        'task': 'common.tasks.task1',
        'schedule': crontab(minute='*/50'), #  50      
    },
    'function3': {
        'task': 'common.tasks.task2',
        'schedule': crontab(minute=0, hour='8,13'), #    8 0  13 0      
    },
}

以下はcommon/tasks/task 1.pyの関数
from celery.task import task

@task
def function2():
    print '='*40
    print 'This is function2, celery is great!'
    print '='*40

以下はcommon/tasks/task 2.pyの関数はtask 1と同じです.pyでは同じ使い方です.
from celery.task import task

@task
def function3():
    print '='*40
    print 'This is function3, celery is great!'
    print 'Fuck celery start failure!'
    print '='*40

七、celeryタイミングタスクの起動
第6節で説明したコマンドを起動してから、このコマンドを実行すると、タイミングタスクが実行されます.beatはceleryのworkerにタイミングタスクを割り当てるだけなので、workerが起動してからタイミングタスクを非同期で実行することができます.その名の通り、workerは苦労した民工で、汚い仕事をしたり、やったりします.beatは工事現場の計画をしている人としてイメージすることができ、仕事をするときに民工に任務を割り当てることができ、請負業者かもしれないし、一般的な工事の進度を管理する弟かもしれない.どうせ苦しい人ばかりだから、キックアスはキックアスを困らせる必要はない.(㈳㈳^㈳㈳)端末コマンドは次のとおりです.
python manage.py celery beat -l info

八、celeryキューの構成
プロジェクトでceleryの非同期タスクが多い場合、このときは異なるタスクを異なるキューに割り当てて実行する必要があります.デフォルトのキューが1つしかない場合、すべての非同期タスクはこのキューで実行されます(キューが必要です.先に実行します).タスクが多い場合、多くのタスクを同時に実行することはできません.任務の渋滞を招くこともある.異なるタスクを異なるキューに割り当てると、同じ時刻に異なるキュー内のタスクを同時に実行し、干渉を補完し、各キューに個別にいくつかのプロセスを開くことができることを保証できます.プロセス数はCPUのコア数を超えないほうがいいです.CPUに4つのコアしかない場合は、5つのプロセスを開き、同じ時間に4つのプロセスしか実行できません.
プロジェクトに3つのキュー(default,frontend,backend)を設定することができ、キューの名前は自分で任意に取ることができます.以下はsettings.pyにキューを追加する構成:
from kombu import Exchange, Queue

#      default
CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_ROUTING_KEY = 'default'

# x-priority       
#              ,                        
CELERY_QUEUES = (
    Queue('default', Exchange('default'), routing_key='default', consumer_arguments={'x-priority': 5}),
    Queue('frontend', Exchange('frontend'), routing_key='frontend', consumer_arguments={'x-priority': 10}),
    Queue('backend', Exchange('backend'), routing_key='backend', consumer_arguments={'x-priority': 8}),
)

#         ,               (     common、tasks    ,task1、task2 py  ,function1  task1.py             ),             
CELERY_ROUTES = {
    "common.tasks.task1.function1": {'queue': "frontend", 'routing_key': 'frontend'},
    "common.tasks.task1.function2": {'queue': "backend", 'routing_key': 'backend'},
    "common.tasks.task2.function3": {'queue': "default", 'routing_key': 'default'},
}

九、celeryキューの起動
キューが構成されている場合はpython manageを実行します.py celery worker--concurrency=2-l infoの場合、デフォルトのキューは1つしか作成されませんが、複数のキューを作成する必要があります.これにより、このコマンドを実行する必要はありません.端末で次のコマンドをそれぞれ実行する必要があります.
# -Q            ,concurrency(   )          ,     CPU     
python manage.py celery worker -l info -Q default --concurrency=1
python manage.py celery worker -l info -Q frontend --concurrency=2
python manage.py celery worker -l info -Q backend --concurrency=4

十、補充
Djangoの下で他のceleryを表示するコマンドは、パラメータの構成、マルチワークプロセスの起動など、python manageを使用することができます.py celery--helpは、端末がコマンドを入力した後に出てくるヒントを表示します.
Usage: manage.py celery  [options] 

Show help screen and exit.

Options:
  -A APP, --app=APP     app instance to use (e.g. module.attr_name)
  -b BROKER, --broker=BROKER
                        url to broker.  default is 'amqp://guest@localhost//'
  --loader=LOADER       name of custom loader class to use.
  --config=CONFIG       Name of the configuration module
  --workdir=WORKING_DIRECTORY
                        Optional directory to change to after detaching.
  -C, --no-color        
  -q, --quiet           
  --version             show program's version number and exit
  -h, --help            show this help message and exit

---- -- - - ---- Commands- -------------- --- ------------

+ Main: 
|    celery worker
|    celery events
|    celery beat
|    celery shell
|    celery multi
|    celery amqp

+ Remote Control: 
|    celery status
 
|    celery inspect --help
|    celery inspect active
|    celery inspect active_queues
|    celery inspect clock
|    celery inspect conf None
|    celery inspect memdump
|    celery inspect memsample
|    celery inspect objgraph None
|    celery inspect ping
|    celery inspect registered
|    celery inspect report
|    celery inspect reserved
|    celery inspect revoked
|    celery inspect scheduled
|    celery inspect stats
 
|    celery control --help
|    celery control add_consumer  [exchange [type [routing_key]]]
|    celery control autoscale [max] [min]
|    celery control cancel_consumer 
|    celery control disable_events
|    celery control enable_events
|    celery control pool_grow [N=1]
|    celery control pool_shrink [N=1]
|    celery control rate_limit   (e.g. 5/s | 5/m | 5/h)>
|    celery control time_limit   [hard_secs]

+ Utils: 
|    celery purge
|    celery list
|    celery migrate
|    celery call
|    celery result
|    celery report
---- -- - - --------- -- - -------------- --- ------------

Type 'celery  --help' for help using a specific command.

転載先:https://www.cnblogs.com/lanlingshao/p/9536650.html