在Django中启动后台任务的简单方法

Mar*_*arc 26 python django asynchronous background-process deferred

我有一个Django网站,一个页面有一个按钮(或链接),点击它将启动一个有点长时间运行的任务.显然,我想将此任务作为后台任务启动,并立即将结果返回给用户.我想使用一种简单的方法实现这一点,这种方法不需要我安装和学习像Celery这样的全新消息传递架构.我不想用芹菜!我只想使用一种简单的方法,我可以设置并在接下来的半小时左右运行.是不是有简单的方法在Django中执行此操作而无需添加(另一个)第三方程序包?

Ben*_*ueg 21

只需使用一个线程.

import threading

t = threading.Thread(target=long_process,
                            args=args,
                            kwargs=kwargs)
t.setDaemon(True)
t.start()
return HttpResponse()
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此问题: Django可以执行多线程工作吗?

  • 我认为这需要更多的可见性.我最近在Celery和RabbitMQ上构建了一个项目,当时我真的应该使用线程.我在这里建立了一个最小的例子:https://github.com/nbwoodward/django-async-threading (4认同)

use*_*114 14

看看django-background-tasks - 它完全符合您的需求,不需要像RabbitMQ或Redis那样运行任何其他服务.它管理数据库中的任务队列,并具有Django管理命令,您可以运行一次或作为cron作业.

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。- [来自评论](/review/low-quality-posts/11499101) (3认同)
  • @Rao链接指向解决问题的模块,而不是如何解决问题的描述.我不知道如何重写帖子,也许你有一些提示? (3认同)
  • 该模块目前仅适用于 Django 1.4 到 1.8。 (2认同)
  • 今天,我们将django-background-tasks的更稳定和更强大的版本(1.1.6)推到了Python软件包索引中。它也支持最新的最大Django版本。发行说明:https://github.com/arteria/django-background-tasks/releases/tag/v1.1.6 (2认同)

Joh*_*ann 6

如果您愿意安装第 3 方库,但想要比 Celery 简单得多的东西,请查看 Redis Queue。它确实需要 Redis,这本身很容易,但这也可以提供许多其他好处。

RQ 本身几乎为零配置。这非常简单。

参考:

  • 这个问题已经有很多年了,但我现在已经使用 RQ 来完成许多此类任务。它确实非常简单,而且很有魅力。强烈推荐。 (3认同)