我试图用Celery定期运行一些功能(任务),比如说每3秒一次。
我最接近的就是一次运行任务。
这是我的Celery配置文件:
# celeryconfig.py
from datetime import timedelta
BROKER_URL = 'amqp://guest@localhost//'
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.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)
这是我的主程序运行的地方:
#tasks_runner.py:
from tasks import f1, f2, dbwapp
f1.delay(5, 6)
f2.delay(7, 8)
我使用python tasks_runner.py
运行我的代码,但是没有设法让这两个函数定期运行。这是我得到的输出:
[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定期运行?
答案 0 :(得分:1)
不需要运行task_runner.py,而是需要将celery beat worker作为一个单独的进程启动:
celery -A proj beat
如下所述:http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html
答案 1 :(得分: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)
它显然会加载celery的默认配置并启动beat
服务启动
根据当前配置发送计划任务。
无论如何,这只发送执行任务但却错过实际工作人员的请求。工人可能是 从另一个控制台开始:
$ celery worker -A tasks
[2016-04-01 00:31:46,950: WARNING/MainProcess] celery@zen 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