我最初在处理计划任务时也遇到了问题,但最终找到了工作流程。
我在 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)
现在让我们看看我是如何使用上述文件示例来运行执行的:
- 首先我安排了“文本文件创建过程”。因此我使用了“python manage.py shell”并导入了tasks.py模块(你可能也可以通过管理页面安排一切,但我还没有测试过):
您现在可以看到计划任务,在管理页面的成功列上带有问号(选项卡“计划任务”,如您的图片中所示):
-
之后我打开了一个新的终端并使用“python manage.py qcluster”启动了集群,导致终端中的输出如下:
可以通过查看“13:22:17 [Q] INFO Processed [ten-virginia-potato-high]”以及终端中的挂钩打印语句“Created a text file”来检查成功执行。此外,您可以在管理页面的“成功任务”选项卡下查看它,您应该会看到:
希望有所帮助!