Django / Celery:一个任务如何能够不断地做某事?是否可以为任务设置无限循环?

问题描述 投票:0回答:1

我目前正在学习 Django 和 Celery。因此,我必须对 Django 项目执行一项功能,为此我使用 Celery:我需要不断检查我的

Redis
服务器中的列表。

为此,我使用 Celery,但我不知道如何正确实现它,所以我选择了

while True:
。 使用
celery -A <my_project> worker -l INFO
启动任务后,无法终止该任务(
CTRL + C
不起作用),或者我不知道如何才能终止该任务。我的结论是,这不是做我想做的事情的好方法。

还有一件事:我知道扩展

django-celery-beat
存在,但我认为打开另一个终端来启动此扩展是“奇怪的”。我已经必须启动我的 django 服务器,然后我的工作人员(带有芹菜)在两个不同的终端上,我必须打开第三个终端来启动我的计划任务,我不知道这样做是否真的很奇怪,但是.. .我不知道,我觉得这样做很奇怪,但我不知道是否真的如此。

这是我 django 项目中

app
中的(独特)任务:

from celery import shared_task
import redis, time


@shared_task
def watcher():
  client = redis.Redis('localhost', port=6379, decode_responses=True)
  queue = 'queue'
  lock_key = 'watcher_key'

  try:
    client.delete(queue)
    if client.get(lock_key):
      print('The matchmaking is already launch.')
      return

    client.set(lock_key, 'true')

    while True:
      in_queue = client.lrange(queue, 0, -1)
      print(f'\'{queue}\': {in_queue}')
      time.sleep(1)
      # don't even know what condition I can put for breaking the loop

  except Exception as e:
    print(f'ERROR REDIS: {e}')
    return
  
  finally:
    client.delete(lock_key)

问题:我不知道/发现如何用好的方法不断检查我的

Redis
服务器中的列表,如果
django-celery-beat
是唯一的解决方案,我会选择它。 所以,我请求你的帮助!

提前谢谢大家!

python python-3.x django celery
1个回答
0
投票

这是正确的,我们实际上不想为 celery Worker 运行命令。理论上,您可以让它在 Docker 或 Kubernetes 容器中运行,但您可能不想做那样的事情。

运行工作线程的最佳方法是使用 Django 的默认管理来设置计划。您需要确保迁移

django-celery-beat
模型,以便您可以在管理中设置不同类型的任务。

要设置默认管理,请按照教程的第 2 页进行操作 并根据需要参阅 Django 管理站点文档

设置完成后,您应该能够根据各种事件设置任务。通过计时器、特定时间,甚至日出。

为了确保您在

celery.py
中设置的功能可以在默认管理中使用,请确保添加装饰器
@shared_task
。这是一个例子:

# Runs once everyday to check if there are any subscriptions to be updated
# SecureSign.celery.task_check_free_trial
from celery import shared_task
@shared_task(expires=45)
def task_check_free_trial():
    print('Checking Free Trial...')
    morningCheckFreeTrial()

要设置定期任务,请登录并在定期任务模型显示的位置添加您的任务,然后添加您所需的时间段以重新运行该任务或选择“一次性任务”。输入celery任务名称时,参考如下:

DjangoMainAppNameOrFolderName.CeleryFile.Function

我喜欢在功能上方对此进行评论,以便您知道在设置任务时应将哪些内容放入管理中。正如你所看到的,我的名字是:

SecureSign.celery.task_check_free_trial
© www.soinside.com 2019 - 2024. All rights reserved.