我目前正在学习 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
是唯一的解决方案,我会选择它。
所以,我请求你的帮助!
提前谢谢大家!
这是正确的,我们实际上不想为 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