在线程内保存到数据库
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 现在可以使用了
我正在使用 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 现在可以使用了