[英]Celery, periodic task execution, with concurrency
我想每秒鍾啟動一次定期任務,但前提是前一個任務結束(db輪詢將任務發送到celery)。 在Celery文檔中,他們使用Django緩存進行鎖定。
我嘗試使用示例:
from __future__ import absolute_import
import datetime
import time
from celery import shared_task
from django.core.cache import cache
LOCK_EXPIRE = 60 * 5
@shared_task
def periodic():
acquire_lock = lambda: cache.add('lock_id', 'true', LOCK_EXPIRE)
release_lock = lambda: cache.delete('lock_id')
a = acquire_lock()
if a:
try:
time.sleep(10)
print a, 'Hello ', datetime.datetime.now()
finally:
release_lock()
else:
print 'Ignore'
具有以下配置:
app.conf.update(
CELERY_IGNORE_RESULT=True,
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
CELERYBEAT_SCHEDULE={
'periodic_task': {
'task': 'app_task_management.tasks.periodic',
'schedule': timedelta(seconds=1),
},
},
)
但是在控制台中,我從未看到“ Ignore
消息,並且每秒都有“ Hello
。 看來鎖不能正常工作。
我使用以下命令啟動定期任務:
celeryd -B -A my_app
和工人:
celery worker -A my_app -l info
你能糾正我的誤會嗎?
從有關本地內存緩存的Django Cache Framework文檔中:
請注意,每個進程都有其自己的專用緩存實例,這意味着不可能進行跨進程緩存。
因此,基本上每個工作人員都在處理自己的緩存。 如果您需要低資源成本的緩存后端,我建議您使用基於文件的緩存或數據庫緩存,兩者都允許跨進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.