【问题标题】:Django Scheduled task using Django-q使用 Django-q 的 Django 计划任务
【发布时间】:2020-06-15 11:17:19
【问题描述】:

我正在尝试使用 Django-q 运行计划任务,我遵循了文档但它没有运行

这是我的配置

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'db_cache_table',
    }
}


Q_CLUSTER = {
    'name': 'DjangORM',
    'workers': 4,
    'timeout': 90,
    'retry': 120,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default'

}

这是我的计划任务

什么都没有执行,请帮忙

【问题讨论】:

    标签: python django scheduled-tasks


    【解决方案1】:

    我最初在处理计划任务时也遇到了问题,但最终找到了工作流程。
    我在 Windows 机器上运行 django-q,使用 django ORM 作为代理。 在谈论我提出的执行例程之前,让我们先快速检查一下我的模块,从 ..

    settings.py:

    Q_CLUSTER = {
        "name": "austrian_energy_monthly",
        "workers": 1,
        "timeout": 10,
        "retry": 20,
        "queue_limit": 50,
        "bulk": 10,
        "orm": "default",
        "ack_failures": True,
        "max_attempts": 1,
        "attempt_count": 0,
    }
    

    .. 和我的文件夹结构:



    如您所见,我的 django 项目的文件夹位于 src 文件夹中。此外,我为这个项目创建的应用程序有一个文件夹,简称为“app”。在 app 文件夹中,我确实有另一个名为“cron”的文件夹,其中包括以下与调度相关的文件和功能:

    tasks.py

    我不使用 django-q 提供的 schedule() 方法,而是直接创建表(参见:django-q official schedule docs

    from django.utils import timezone
    from austrian_energy_monthly.app.cron.func import create_text_file
    
    from django_q.models import Schedule
    
    Schedule.objects.create(
        func="austrian_energy_monthly.app.cron.func.create_text_file",
        kwargs={"content": "Insert this into a text file"},
        hooks="austrian_energy_monthly.app.cron.hooks.print_result",
        name="Text file creation process",
        schedule_type=Schedule.ONCE,
        next_run=timezone.now(),
    )
    

    确保为“func”关键字分配“正确”路径。仅使用“func.create_text_file”,对我来说并不奏效,即使这些文件位于同一个文件夹中。 “钩子”关键字也是如此。
    注意:我已经通过 setup.py 将我的项目设置为开发包,这样我就可以从我的 src 文件夹中的任何地方调用它)

    func.py:

    包含调度表对象调用的函数。

    def create_text_file(content: str) -> str:
        file = open(f"copy.txt", "w")
        file.write(content)
        file.close()
        return "Created a text file"
    

    hooks.py:

    包含计划进程完成后调用的函数。

    def print_result(task):
        print(task.result)
    

    现在让我们看看我是如何使用上述文件示例来运行执行的:

    1. 首先我安排了“文本文件创建过程”。因此我使用了“python manage.py shell”并导入了tasks.py模块(你可能也可以通过管理页面安排一切,但我还没有测试过):

    您现在可以看到计划任务,在管理页面的成功列上带有问号(选项卡“计划任务”,如您的图片中所示):

    1. 之后我打开了一个新的终端并使用“python manage.py qcluster”启动了集群,导致终端中的输出如下:

    可以通过查看“13:22:17 [Q] INFO Processed [ten-virginia-potato-high]”以及终端中的挂钩打印语句“Created a text file”来检查成功执行。此外,您可以在管理页面的“成功任务”选项卡下查看它,您应该会看到:

    希望有所帮助!

    【讨论】:

    • 感谢您的详尽回答。在我从python manage.py shell 执行import app.tasks 之后,我只能看到时间表。这行得通。但是有没有办法在我们启动server/qcluster的时候自动启动呢?
    【解决方案2】:

    Django-q 不支持 windows。 :)

    【讨论】:

    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2021-06-15
    • 2021-12-02
    • 2014-12-10
    • 2017-09-22
    • 2011-09-12
    • 2021-04-19
    • 2014-03-17
    相关资源
    最近更新 更多