Django后台任务
我需要每隔几分钟在Django中更新一个SQLite数据库,但我希望在数据更新之前,能够继续使用旧的数据。也就是说,我不想因为等待数据而停下来;只有在数据库被锁住的时候,我才会被迫停下来。
我也不想安装其他的程序或库。
我该如何设置一个新的线程,让它可以在不出现线程问题的情况下,调用save()
来保存一堆模型的数据呢?
6 个回答
6
关于John Lehmann的回答,给大家一个简单的更新:django-background-task这个工具之前没有人维护,而且跟新版本的Django不兼容。我们在一段时间前对它进行了更新,并增加了一些新功能,现在在Github上维护这个新的、向后兼容的版本。新的django-background-tasks应用可以从PyPI上下载或安装。
18
Celery 是一个异步任务队列/工作队列,主要通过分布式消息传递来工作。它的重点是实时操作,但也支持定时任务。
Celery 是用 Python 编写的,不过它的协议可以用任何语言来实现。它还可以通过网络钩子与其他语言一起使用。
20
如果你只想要一个轻量级的解决方案来在后台执行一些任务,而不是一个复杂的任务管理系统,可以看看django-utils。这个工具里有很多功能,其中包括一个叫做@async的函数装饰器,它可以让一个函数在单独的线程中异步执行。
使用方法如下:
from djutils.decorators import async
@async
def load_data_async():
# this will be executed in a separate thread
load_data()
这样你就可以调用load_data_async function
来在后台执行,或者调用普通的load_data
函数来进行阻塞执行。
记得安装2.0之前的版本,因为那个版本没有@async这个装饰器。
注意:如果觉得安装django-utils太麻烦,你也可以直接下载它,然后把几个必要的文件放到你的项目里。