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太多,您只需下载它并在项目中包含一些必需的文件即可.
只是对John Lehmann的回答进行了快速更新:django-background-task没有维护,与更新的Django版本不兼容.我们不久前更新并扩展了新功能,并在Github上维护了新的向后兼容软件包.可以从PyPI下载或安装新的django-background-tasks应用程序.
取决于您是否需要从读者的角度看更新看起来是原子的.如果您不介意将旧数据和新数据放在一起,只需创建一个填充数据的自定义管理命令,然后每隔几分钟从cron运行一次.
如果你需要它看起来是原子的,通过django.db.transaction将所有写入包装在一个SQLite事务中应该可能为你提供必要的锁.