用于异步周期性任务的 Django 通道

Django channels for asynchronous periodic tasks

我发现大多数关于 Django Channels 的文档都是关于 WebSockets 的。但我想以不同的方式使用它们,我相信这是可能的。

如何运行使用Django通道的异步周期任务?例如,我想每 15 秒检查一次某些网站上的温度(通过 API),当它的命中 > 20 时我需要一个通知。

也意味着这个task会存活很长时间(甚至可能3个月),Django有能力让消费者存活很长时间吗?

谢谢。

Channels 很容易用于后台任务 - 请在此处查看有关使用新版 Channels 执行此操作的说明:

https://github.com/jayhale/channels-examples-bg-task

有了后台任务,您就可以设置一个可以使用 cron 调用的任务,它可以在您想要的任何时间段将您的任务放入队列中。 cron 的缺点是它不能开箱即用地进行分分钟的调度——需要一些黑客攻击。参见:Running a cron every 30 seconds

例如:

向应用程序用户的 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'})

关于工人的预期可靠性 - 他们可以 运行 无限期地,但你应该预料到他们偶尔会失败。管理工作人员更多的是您打算如何监督流程(或容器,或者您正在构建的架构)的问题。