【问题标题】:Using sql across multiple threads Python跨多个线程Python使用sql
【发布时间】:2018-10-27 06:05:30
【问题描述】:

我有一个服务器允许(管理员)创建、删除或编辑其他用户的详细信息, 我已经在函数内的光标旁边创建了数据库:

def DBSetup():
    global schoolDBConn, schoolDBCursor
    print("Setting up databases")
    schoolDBConn = sqlite3.connect("SCHOOL_DB.db")
    schoolDBCursor = schoolDBConn.cursor()
    schoolDBCursor.execute(
                            """
                               CREATE TABLE IF NOT EXISTS USER_DETAILS 
                               (
                               username text,
                               password text,
                               clearance int,
                               classes int
                               )
                            """
                            )
    schoolDBCursor.execute(   #line 300
                            """
                            CREATE TABLE IF NOT EXISTS CLASSES  
                            (
                            className text,
                            supervisor text,
                            assignmentName text
                            )
                            """
                            )
    schoolDBCursor.execute(
                            """
                            CREATE TABLE IF NOT EXISTS ASSIGNMENT 
                            (
                            setDate text,
                            dueDate text,
                            assignmentInfo text,
                            supervisor text
                            )  
                            """
                             )

我在服务器启动时调用它,然后开始我的线程:

if __name__ == "__main__":
    DBSetup()
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, port))
    s.listen(1)
    while True:
        conn, addr = s.accept()
        connThread = Thread(target=handler, args=(conn, addr))
        connThread.daemon = True
        connThread.start()

但是在我的线程中,每当我使用编辑数据库的函数时,我都会收到此错误:

SQLITE3 ERROR:

SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 9628 and this is thread id 12400

每当我编辑数据库时,我都会在我的程序“With global_lock:”中使用全局锁。

提前谢谢你

【问题讨论】:

标签: python sqlite python-multithreading


【解决方案1】:

您可以将check_same_thread 参数设置为false。在你的情况下是这样的:

schoolDBConn = sqlite3.connect("SCHOOL_DB.db", check_same_thread=False)

来自文档:

默认情况下,check_same_threadTrue,只有创建线程可以使用连接。如果设置False,返回的连接可能会被多个线程共享。当使用多个线程时,同一个连接的写入操作应该由用户序列化以避免数据损坏。

【讨论】:

  • 谢谢,现在似乎可以工作,将测试当我有多个线程时它是如何运行的,希望锁能正常工作
猜你喜欢
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多