我有一个简单的Python类,它是Thread的子类。在run方法中,我连接到sqlite db,进行简单的select查询,然后关闭连接。非常标准的东西:
def run(self):
conn = sqlite3.connect(SHAPE_CACHE_DB)
curs = conn.cursor()
curs.execute('SELECT * from foo')
for row in curs.fetchall():
# do stuff
curs.close()
conn.close()
当一次只运行一个线程时,run方法执行得非常快 - 只需< 1秒。但是如果该类的多个实例被实例化并运行 - 比如说6个或更多,那么run方法可能需要很多秒?
我猜测线程之间的读取访问之间存在一些争用。但我认为sqlite允许对并发线程进行读访问???
答案 0 :(得分:1)
首先,sqlite模块不是线程安全的:
https://docs.python.org/2/library/sqlite3.html#multithreading
其次,您正在从六个线程执行“SAME”查询,这意味着您正在完成六倍的工作。如果您的单线程版本在循环中执行六个查询,那么比较公平的比较。
第三,因为您将使用多个线程进行线程切换并为此付出一些代价。
答案 1 :(得分:0)
我认为这是一个GIL问题。我没有子类Thread,而是切换到multiprocessing.Process - 该类的所有实例现在都执行类似的操作。