繁体   English   中英

Python sqlite3-只读多个线程=慢

[英]Python sqlite3 - Read Only From Multiple Threads = SLOW

我有一个简单的Python类,它是Thread的子类。 在run方法中,我连接到sqlite db,进行简单的选择查询,然后关闭连接。 相当标准的东西:

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允许对并发线程进行读取访问???

首先,sqlite模块不是线程安全的:

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

其次,您正在从六个线程中执行“ SAME”查询,这意味着您正在执行的工作量是原来的六倍。 如果您的单线程版本在一个循环中执行六个查询,则比较公平一些。

第三,因为您将使用多个线程进行线程切换,并为此付出了一些成本。

我认为这是/曾经是GIL问题。 我不再使用Thread子类,而是切换到multiprocessing.Process-该类的所有实例现在都具有类似的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM