【问题标题】:Separate thread for saving django models用于保存 Django 模型的单独线程
【发布时间】:2012-05-24 10:54:53
【问题描述】:

我正在构建一个使用远程数据库的应用程序 - 它将 A 类型的对象保存到数据库,并从数据库读取 B 类型的对象。

由于saving models has the potential to block and release the GIL 和应用程序本身不使用保存的对象,我想将对.save() 的调用移至单独的线程。

我知道 Django 通常不是线程安全的。所以我的问题是 - 在另一个线程保存 A 类型的对象时查询 B 类型的对象是否有任何问题?

【问题讨论】:

    标签: database django postgresql thread-safety gil


    【解决方案1】:

    这实际上并不能回答问题,但我认为您最好设置一个消息队列系统并使用另一个进程来处理消息。

    不要保存,而是将新/修改的对象放在本地存储中(最好是 GAE 任务队列或 Amazon SQS 服务,但任何类型的本地存储都可以)并在旁边处理它们。

    但是,基本上,您正在实施数据库复制方案(即使使用线程,您的本地存储也是内存),因此您可能应该考虑实际使用全功能复制。

    【讨论】:

      【解决方案2】:

      最简单的方法是使用 ztask 将其卸载到单独的进程。

      from django_ztask.decorators import task
      
      @task()
      def delayed_save(obj):
          obj.save()
      
      ...
      
      your_object.something = "something"
      delayed_save.async(your_object)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-28
        • 2022-01-04
        • 2021-10-21
        • 1970-01-01
        • 2014-12-20
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        相关资源
        最近更新 更多