我正在构建一个使用远程数据库的应用程序 - 它将 A 类型的对象保存到数据库并从数据库中读取 B 类型的对象。
由于保存模型有可能阻塞和释放 GIL,并且应用程序本身不使用保存的对象,我想将调用移至.save()
单独的线程。
我知道 Django 通常不是线程安全的。所以我的问题是 - 在另一个线程保存 A 类型的对象时查询 B 类型的对象是否有任何问题?
我正在构建一个使用远程数据库的应用程序 - 它将 A 类型的对象保存到数据库并从数据库中读取 B 类型的对象。
由于保存模型有可能阻塞和释放 GIL,并且应用程序本身不使用保存的对象,我想将调用移至.save()
单独的线程。
我知道 Django 通常不是线程安全的。所以我的问题是 - 在另一个线程保存 A 类型的对象时查询 B 类型的对象是否有任何问题?
这实际上并不能回答问题,但我认为您最好设置一个消息队列系统并使用另一个进程来处理消息。
不要保存,而是将新/修改的对象放在本地存储中(最好是 GAE 任务队列或 Amazon SQS 服务,但任何类型的本地存储都可以)并在旁边处理它们。
但是,基本上,您正在实施数据库复制方案(即使使用线程,您的本地存储也是内存),因此您可能应该考虑实际使用全功能复制。
最简单的方法是使用ztask将其卸载到单独的进程。
from django_ztask.decorators import task
@task()
def delayed_save(obj):
obj.save()
...
your_object.something = "something"
delayed_save.async(your_object)