2016-03-31 20 views
2

Celeryでは、3秒ごとに定期的にいくつかの機能(タスク)を実行しようとしています。Celeryタスクを定期的に実行する(Djangoなし)

最も近いのは、タスクを1回実行することです。

これは私のセロリの設定ファイルである:

# tasks.py: 
import celeryconfig 
from celery import Celery 
from celery import task 

dbwapp = Celery('tasks') 
dbwapp.config_from_object(celeryconfig) 

@dbwapp.task() 
def f1(a, b): 
    print "F1: {0}, {1}".format(a, b) 

@dbwapp.task() 
def f2(a, b): 
    print "F2: {0}, {1}".format(a, b) 

そして、私のメインのプログラムを実行する場所これは次のとおりです:私はタスクを宣言する場所です

# celeryconfig.py 
from datetime import timedelta 

BROKER_URL = 'amqp://[email protected]//' 

CELERY_RESULT_BACKEND = 'rpc://' 

CELERYBEAT_SCHEDULE = { 
    'f1-every-3-seconds': { 
     'task': 'tasks.f1', 
     'schedule': timedelta(seconds=3), 
     'args': (1, 2) 
    }, 
    'f2-every-3-seconds': { 
     'task': 'tasks.f2', 
     'schedule': timedelta(seconds=3), 
     'args': (3, 4) 
    }, 
} 

#tasks_runner.py: 
from tasks import f1, f2, dbwapp 


f1.delay(5, 6) 
f2.delay(7, 8) 

を私はコードをpython tasks_runner.pyで実行しますが、これらの2つの機能を定期的に実行させることはできません。これは私が得る出力です:

[2016-03-31 23:36:16,108: WARNING/Worker-9] F1: 5, 6 
[2016-03-31 23:36:16,109: WARNING/Worker-6] F2: 7, 8 

私は間違っていますか? f1とf2を定期的に実行するにはどうすればよいですか?ここで説明したように

celery -A proj beat

:代わりにtask_runner.pyを実行しているの

答えて

1

はあなたのコードを使用して、私がすることができましたセロリを含む開始。スケジュールされたタスクこの方法:

$ celery beat                   (env: celery) 
celery beat v3.1.23 (Cipater) is starting. 
__ - ... __ -  _ 
Configuration -> 
    . broker -> redis://localhost:6379/0 
    . loader -> celery.loaders.default.Loader 
    . scheduler -> celery.beat.PersistentScheduler 
    . db -> celerybeat-schedule 
    . logfile -> [stderr]@%INFO 
    . maxinterval -> now (0s) 
[2016-04-01 00:15:05,377: INFO/MainProcess] beat: Starting... 
[2016-04-01 00:15:08,402: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:08,410: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:11,403: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:11,411: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:14,404: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:14,412: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:17,404: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:17,412: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:20,405: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:20,413: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:23,406: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:23,413: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 
[2016-04-01 00:15:26,407: INFO/MainProcess] Scheduler: Sending due task f2-every-3-seconds (tasks.f2) 
[2016-04-01 00:15:26,414: INFO/MainProcess] Scheduler: Sending due task f1-every-3-seconds (tasks.f1) 

それは明らかにセロリのデフォルト設定をロードし、現在の設定に応じてスケジュールされたタスクを発射beatサービス開始 を開始します。

とにかく、これはタスクを実行する要求を送信するだけですが、実際の作業者は見逃します。労働者は は別のコンソールで起動することができる。

$ celery worker -A tasks 
[2016-04-01 00:31:46,950: WARNING/MainProcess] [email protected] ready. 
[2016-04-01 00:31:47,029: WARNING/Worker-4] F2: 3, 4 
[2016-04-01 00:31:47,029: WARNING/Worker-2] F1: 1, 2 
[2016-04-01 00:31:47,036: WARNING/Worker-3] F2: 3, 4 
[2016-04-01 00:31:47,036: WARNING/Worker-1] F1: 1, 2 
[2016-04-01 00:31:48,829: WARNING/Worker-4] F2: 3, 4 
[2016-04-01 00:31:48,829: WARNING/Worker-2] F1: 1, 2 

あなたが唯一の労働者を使用する場合は、beatサービスを一度にそれを起動することがあります。

$ celery worker -A tasks -B 
関連する問題