kusocodeing
kusocodeing

Reputation: 127

python3 multi threading with sqlite shared memory error in wal mode: sqlite3.OperationalError: database table is locked

I am trying to implement the shared memory database. The objective is to allow non-blocking reading access to the database for the IPC among threading.

The setting is following

def __init__(self):
        self.fname=f"file::memory:?cache=shared"
        self.db = sqlite3.connect(self.fname,uri=True)
        cur = self.db.cursor()
        cur.execute('pragma journal_mode=wal')
        cur.close()

Here is how to insert and query the database

def put(self,tbn,data):
    cur = self.db.cursor()
    sql=f"""INSERT into {tbn} VALUES ({time.time()},{data});"""
    cur.execute(sql)
    self.db.commit()
    cur.close()
def get(self,tbn,timestamp=0):
    cur = self.db.cursor()
    sql=f"""Select data from {tbn} where timestamp>{timestamp}"""
    data=cur.execute(sql).fetchall()
    cur.close()
    return [d[0] for d in data]

and here is the worker to read and the main to write

def worker():
    buffer=DBBuffer()
    readed=0
    while 1:
        data=buffer.get(topic)
        time.sleep(0.0001)    
if __name__=="__main__":
    buffer=DBBuffer()
    buffer.init_table(topic)
    print("start")
    t = Thread(target=worker)
    t.daemon =True
    t.start()
    while 1:
        buffer.put(topic,time.time())
        
        time.sleep(1)
    
    del(buffer)





    

However, it gets the error:

    Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File ".\DBsharemenory.py", line 66, in worker
    data=buffer.get(topic)
  File ".\DBsharemenory.py", line 49, in get
    data=cur.execute(sql).fetchall()
sqlite3.OperationalError: database table is locked: topic1

Is there any solution for it?

Upvotes: 0

Views: 23

Answers (0)

Related Questions