Python和sqlite3.ProgrammingError:不允许递归使用游标

时间:2014-10-29 11:23:28

标签: python multithreading sqlite cursor

我编写了一个这样的python程序,它应该以多线程模式运行:

def Func(host,cursor,db):

    cursor.execute('''SELECT If_index, Username, Version, Community, Ip_traff FROM HOST WHERE
    Hostname = ?''',(host,))

    #do something

#--- Main ---

db = sqlite3.connect(os.getcwd()+'\HOST', check_same_thread = False) #opendatabase       
cursor = db.cursor()                                                 #generate a cursor

for ii in range(len(host)):  #host is a list of ipaddress

    #for each host i want generate a thread
    thr = threading.Thread(target = Func, args=(host[ii],cursor,db) 
    thr.start()

我收到sqlite3.ProgrammingError:不允许递归使用游标。在这种情况下,如何管理sqlite3的递归游标? 非常感谢 保罗

1 个答案:

答案 0 :(得分:3)

嗯,问题是sqlite3模块不喜欢多线程的情况,你可以在sqlite3模块的文档中看到

  

... Python模块不允许在线程[1]

之间共享连接和游标

我要做的是在Func函数中使用某种同步,例如,threading.Lock [2]。你的Func将如下所示:

# Define the lock globally
lock = threading.Lock()

def Func(host,cursor,db):
    try:
        lock.acquire(True)
        res = cursor.execute('''...''',(host,))
        # do something
    finally:
        lock.release()

前面的代码将通过让一个线程获取锁来同步cursor.execute的执行,其他线程将等到它被释放,当带有锁的线程完成时,它会释放锁让其他人接受它。

这应该解决问题。

  

[1] https://docs.python.org/2/library/sqlite3.html#multithreading

     

[2] https://docs.python.org/2/library/threading.html?highlight=threading#rlock-objects