【发布时间】: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