【问题标题】:Django running long sql process in backgroundDjango在后台运行长sql进程
【发布时间】:2019-09-16 19:57:02
【问题描述】:

我有一个网页,当用户单击某个按钮时,我需要在其中运行一个长的 sql 进程(最多 20 分钟左右)。脚本运行,但用户无法继续浏览网站的其余部分。

我想拥有它,以便在单击按钮时,它会进入在后台运行的队列。

我查看了 django-background-tasks,但问题是在不运行 python manage.py process_tasks 的情况下似乎无法启动排队的任务。

听说过Celery,但是我用的是Windows系统,好像不太合适。

我是 django 和网站基础架构的新手,不确定这是否可行。我还在较早的回复中看到 threading 包可以做到这一点,但我不确定它是否已过时。

【问题讨论】:

  • 我不明白运行 process_tasks 有什么问题。
  • 要添加到上面的评论 - 对于最常见的后台作业框架,您需要启动一个单独的进程,该进程与您的常规网络服务器一起运行。您不需要每次想要运行任务时都调用python manage.py process_tasks,您需要调用一次并让该进程与您的网络服务器进程一起运行。
  • 我使用 Celery 并运行 Windows 10。完全可行。我也使用 Docker,这使得跨平台开发更容易。

标签: django


【解决方案1】:

您可以使用 Asyncio 提供的 create_task,它可以为您运行后台任务,而不会阻塞客户端的视图。

Python 3.7+

Asyncio create_task

免责声明:我不太确定 myfunc() 是否需要异步,除非您正在执行有价值的异步任务。

您还可以在 myfunc() 中设置一个 while 循环,用于定期重复操作。

import asyncio

async def myfunc():
    await asyncio.sleep(5)
    print("Hi, after 5 seconds.")

task = asyncio.create_task(myfunc(), )

【讨论】:

    猜你喜欢
    • 2013-11-23
    • 1970-01-01
    • 2021-08-20
    • 2023-03-10
    • 2021-04-06
    • 2016-11-17
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多