Django通道用于异步定期任务

yan*_*nik 10 python django asynchronous django-channels

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

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

这也意味着这项任务将持续很长时间(甚至可能持续3个月),Django能否让消费者长期生活?

谢谢.

Jay*_*Jay 6

可以轻松地将频道用于后台任务-请在此处查看有关使用新版本的频道进行操作的说明:

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

有了后台任务,您可以设置一个可以用cron调用的任务,该任务可以在任意时间将任务放入队列。cron的缺点是,它不会立即进行数分钟的调度-需要进行一些黑客操作。请参阅:每30秒运行一次cron

例如:

将作业添加到应用程序用户的crontab中:

# crontab
/5 * * * * python manage.py cron_every_5_minutes
Run Code Online (Sandbox Code Playgroud)

您的定制管理命令可以生成通道的任务:

# 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'})
Run Code Online (Sandbox Code Playgroud)

关于工人的预期可靠性-它们可以无限期地运行,但是您应该期望它们偶尔会失败。管理工人更多地是关于您打算如何监督流程(或容器,或您正在设计的)的问题。