Django Channels用于异步定期任务。

10
我发现大多数关于Django Channels的文档都是关于WebSockets的。但我想以不同的方式使用它们,我相信这是可能的。
如何使用Django Channels运行异步周期任务?例如,我想每15秒检查一次某个网站(通过API)的温度,并且当其达到> 20时需要通知。
这也意味着这个任务将长期存在(甚至可能长达3个月),Django能够保持消费者长时间活动吗?
谢谢。

也许 Hendrix 会更好 https://github.com/hendrix/hendrix - frmdstryr
1个回答

7
Channels可以轻松用于后台任务-点击此处查看如何在新版本的Channels中执行此操作的说明:https://github.com/jayhale/channels-examples-bg-task 设置了后台任务后,您可以设置一个任务,该任务可通过cron调用,并将您的任务放入队列中,以便在任何时间间隔内运行。缺点是cron默认情况下不会进行亚分钟级别的调度-需要一些技巧。请参见:每30秒运行cron 例如:
将作业添加到应用程序用户的crontab中:
# crontab
/5 * * * * python manage.py cron_every_5_minutes

您的自定义管理命令可以为通道生成任务:
# myapp/management/commands/cron_every_5_minutes.py

from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    channel_layer = get_channel_layer()
    help = 'Periodic task to be run every 5 minutes'

    def handle(self, *args, **options):
        async_to_sync(channel_layer.send)('background-tasks', {'type': 'task_5_min'})

关于工作人员的预期可靠性 - 他们可以无限期运行,但您应该预期偶尔会出现故障。管理工人更多是一个问题,即您打算如何监督进程(或容器,或者您正在进行架构)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接