Django通道用于异步定期任务

时间:2017-02-28 16:24:29

标签: python django asynchronous django-channels

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

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

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

谢谢。

1 个答案:

答案 0 :(得分:4)

频道很容易用于后台任务 - 请参阅此处了解有关使用新版频道的说明:

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

在后台任务到位的情况下,您可以设置一个可以使用cron调用的任务,该任务可以在您想要的任何时间段将任务放入队列中。对cron的下行是它不会开箱即用的分钟调度 - 需要一些黑客攻击。请参阅:Running a cron every 30 seconds

E.g:

将作业添加到应用用户的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'})

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