Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和sqlite3.ProgrammingError:不允许递归使用游标_Python_Multithreading_Sqlite_Cursor - Fatal编程技术网

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

Python和sqlite3.ProgrammingError:不允许递归使用游标,python,multithreading,sqlite,cursor,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()

我编写了一个类似这样的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的递归游标? 谢谢
Paolo

问题是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()
前面的代码将同步游标的执行。通过只让一个线程执行锁,其他线程将等待它被释放,当带锁的线程完成时,它将释放锁,让其他线程执行

这应该可以解决问题

[1]

[2]


为什么不为每个线程指定自己的游标呢?我使用了lock:而不是try and finally(更紧凑)谢谢:)