This repository was archived by the owner on Jun 11, 2025. It is now read-only.
Description minimal repro i could come up with. Tested on python 3.11 (created via conda create -n deadlock python=3.11 anaconda)
run via: python main.py [sqlite3/libsql]
Versions:
(deadlock) mihai[deadlock]$ pip freeze | grep "Flask\|libsql"
Flask==3.0.2
Flask-Cors==4.0.0
libsql-client==0.3.1
import libsql_client
import os
import sys
import sqlite3
from flask .testing import FlaskClient
from flask import Flask , Response , current_app
def get_data () -> Response :
if isinstance (current_app .db , sqlite3 .Connection ):
data = current_app .db .execute ("select item from data" ).fetchall ()[0 ][0 ]
else :
data = current_app .db .execute ("select item from data" ).rows [0 ][0 ]
return {"hello" : data }, 200
def _setup_db (db_path : str ):
os .remove (db_path )
client = libsql_client .create_client_sync (f"file:{ db_path } " )
client .execute ("create table data (id integer primary key unique, item text)" )
client .execute ("insert into data(id, item) values(null, 'world')" )
client .close ()
def setup_app (db_path : str , engine : str ) -> Flask :
assert engine in ("sqlite3" , "libsql" ), engine
app = Flask (__name__ )
app .add_url_rule ("/get_data" , "get_data" , view_func = get_data , methods = ["GET" ])
if engine == "sqlite3" :
app .db = sqlite3 .Connection (db_path )
else :
app .db = libsql_client .create_client_sync (f"file:{ db_path } " )
return app
if __name__ == "__main__" :
_setup_db ("test.db" )
app = setup_app ("test.db" , sys .argv [1 ])
app .config .update ({"TESTING" : True })
flask_client : FlaskClient = app .test_client ()
data = flask_client .get ("get_data" ).json
assert data ["hello" ] == "world"
Upon ctrl+c:
^CException ignored in: <module 'threading' from '/home/mihai/libs/miniconda3/envs/deadlock/lib/python3.11/threading.py'>
Traceback (most recent call last):
File "/home/mihai/libs/miniconda3/envs/deadlock/lib/python3.11/threading.py", line 1590, in _shutdown
lock.acquire()
KeyboardInterrupt:
Reactions are currently unavailable