【问题标题】:Save to database inside thread保存到线程内的数据库
【发布时间】:2015-10-15 05:22:31
【问题描述】:

我正在使用 django,

我有一个线程,其目的是获取数据库项目的排队列表并修改它们

这是我的模型:

class MyModel(models.Model):
    boolean = models.BooleanField(editable=False)

以及有问题的代码:

def unqueue():
    while not queue.empty():
        myList = queue.get()
        for i in myList:
            if not i.boolean:
                break
            i.boolean = False
            i.save()   # <== error because database table is locked
        queue.task_done()


queue = Queue()

thread = Thread(target=unqueue)
thread.start()

def addToQueue(pk_list): # can be called multiple times simultaneously
    list = []
    for pk in pk_list:
        list.append(MyModel.objects.get(pk=pk))
    queue.put(list)

我现在的代码缺少很多检查等...我在这里简化以使其更清晰

如何才能在线程内保存到我的数据库?

编辑:我需要同步,因为不能覆盖 i.boolean(以及我的真实代码中的其他属性)

我尝试在数据库中创建一个专用表,但没有成功,我仍然遇到同样的问题

编辑 2:我应该准确地说我正在使用 SQLite3。我试图查看是否可以解锁/锁定 SQLite 中的特定表,并且似乎锁定仅适用于整个数据库。这可能就是为什么使用专用表没有帮助的原因。

这对我很不利,因为我需要从不同的线程同时访问不同的表,有可能吗?

编辑 3:看来我的问题是这里列出的问题 https://docs.djangoproject.com/en/1.8/ref/databases/#database-is-locked-errors

【问题讨论】:

  • 我很好奇是什么让你选择这种方法而不是让客户端异步处理 POST 数据?
  • 其实我需要确保 myObject 只写一次,这里是不可见的,但是在修改它之前我必须检查我的布尔值是否已经为假

标签: python django multithreading sqlite queue


【解决方案1】:

您确定需要同步队列吗?异步解决方案可能会解决您的问题吗? Need a thread-safe asynchronous message queue

【讨论】:

  • 是的,我绝对确定,我需要确保myitem不是多次写入,只需要写入一次
【解决方案2】:

我找到的解决方案是更改数据库,

SQLite 不允许这样的并发访问。

我切换到 MySql,它现在可以工作了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多