我正在构建使用远程数据库的应用程序 - 它将类型A 的对象保存到数据库,并从数据库中读取B 类型的对象。用于保存Django模型的单独线程
由于saving models has the potential to block and release the GIL和应用程序不使用保存的对象本身,我想将呼叫移动到.save()
到一个单独的线程。
我知道Django一般不是线程安全的。所以我的问题是 - 在查询类型B的对象时可以有任何问题,而另一个线程保存类型A的对象?
我正在构建使用远程数据库的应用程序 - 它将类型A 的对象保存到数据库,并从数据库中读取B 类型的对象。用于保存Django模型的单独线程
由于saving models has the potential to block and release the GIL和应用程序不使用保存的对象本身,我想将呼叫移动到.save()
到一个单独的线程。
我知道Django一般不是线程安全的。所以我的问题是 - 在查询类型B的对象时可以有任何问题,而另一个线程保存类型A的对象?
这实际上并没有回答这个问题,但我认为你最好设置一个消息队列系统并使用另一个进程来处理消息。
不是保存,而是将新的/修改的对象放置在本地存储中(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)