Django背景任务

Meh*_*dad 18 python database django multithreading background-thread

我需要在Django中每隔几分钟填充一个SQLite数据库,但我想提供过时的数据,直到数据可供数据库更新.(即我不想阻止收集数据; 我唯一可以阻止的是数据库上是否存在锁定,在此期间我别无选择.)

我也不想安装单独的程序或库.

我如何设置另一个可以调用save()一堆模型的线程,而不会遇到线程问题?

小智 18

如果您正在寻找一种轻量级解决方案,只需在后台执行操作而不是完整的任务管理系统,请查看django-utils.除其他外,它包括一个@async函数装饰器,它将使函数在一个单独的线程中异步执行.

像这样使用它:

from djutils.decorators import async

@async
def load_data_async():
    # this will be executed in a separate thread
    load_data()
Run Code Online (Sandbox Code Playgroud)

然后你可以调用load_data_async functionfor background或者load_data阻塞执行的普通函数.

只需确保在2.0之前安装一个版本,因为它缺少@async装饰器.

注意:如果甚至安装django-utils太多,您只需下载它并在项目中包含一些必需的文件即可.


S.L*_*ott 17

芹菜.

Celery是基于分布式消息传递的异步任务队列/作业队列.它专注于实时操作,但也支持调度.

Celery是用Python编写的,但协议可以用任何语言实现.它还可以使用webhook与其他语言一起使用.


phi*_*phi 6

只是对John Lehmann的回答进行了快速更新:django-background-task没有维护,与更新的Django版本不兼容.我们不久前更新并扩展了新功能,并在Github上维护了新的向后兼容软件包.可以从PyPI下载或安装新的django-background-tasks应用程序.


che*_*che 5

取决于您是否需要从读者的角度看更新看起来是原子的.如果您不介意将旧数据和新数据放在一起,只需创建一个填充数据的自定义管理命令,然后每隔几分钟从cron运行一次.

如果你需要它看起来是原子的,通过django.db.transaction将所有写入包装在一个SQLite事务中应该可能为你提供必要的锁.

  • @Mehrdad:几乎每个系统都有某种任务调度程序.类似Unix的人有`cron`,Windows有http://en.wikipedia.org/wiki/Task_Scheduler (2认同)