我发现大多数关于Django频道的文档都是关于WebSockets的。但我想以不同的方式使用它们,我相信它是可能的。
如何使用Django频道运行异步定期任务?例如,我想每隔15秒检查一些网站上的温度(通过API),当它点击时,我需要通知> 20。
这也意味着这项任务将持续很长时间(甚至可能持续3个月),Django能否让消费者长期生存?
谢谢。
答案 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'})
关于工人的预期可靠性 - 他们可以无限期地运行,但是你应该期望它们偶尔会失败。管理工人更多的是你打算如何监督流程(或容器,或者你正在架构)的问题。