vendredi 24 juillet 2015

Save to database inside thread

I'm working with django,

I have a thread whose purpose is to take queued list of database items and modify them

Here is my model :

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

and the problematic code :

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 now the code is missing lot of check ect... I simplified here to make it clearer

What can I do to be able to save to my db while inside the thread ?

EDIT : I need to be synchronous because i.boolean (and other properties in my real code) mustn't be overwrite

I tried to create a dedicated Table in the database but it didn't work, I still have the same issue

EDIT 2 : I should precise that I'm using SQLite3. I tried to see if I could unlock/lock specific table in SQLite and it seem that locking apply on the entire db only. That is probably why using a dedicated table wasn't helpful.

That is bad for me, because I need to access different table simultaneously from different thread, is it possible ?

Aucun commentaire:

Enregistrer un commentaire