在线程内保存到数据库

Save to database inside thread

我正在使用 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(以及我真实代码中的其他属性)不能被覆盖

我试图在数据库中创建一个专用的 Table 但它没有用,我仍然有同样的问题

编辑 2:我应该准确地说我正在使用 SQLite3。我试着看看我是否可以在 SQLite 中 unlock/lock 具体 table 并且似乎锁定仅适用于整个数据库。这可能就是使用专用 table 没有帮助的原因。

这对我来说很糟糕,因为我需要从不同的线程同时访问不同的 table,这可能吗?

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

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

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

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

我切换到 MySql 现在可以使用了