Peewee 查询在多线程下运行缓慢

在将 peewee 与线程一起使用时,我发现了这个有趣的场景。


我有一张看起来像这样的桌子


class Locks(BaseModel):

_id = AutoField()

name = CharField(unique=True, index=True)

last_modify_time = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])

owner = CharField()


class Meta:

    table_name = 'locks'

我想用这个 sql 查询它包含的记录数:


sql = Locks.select().where(Locks.name == 'test')

sql.execute()

很简单,对吧?但是我发现它运行得非常慢。在没有线程的情况下,查询我们网络中的数据库所需的时间为 3 - 5 毫秒。但是当涉及到多线程时,它会增长到 70 毫秒。


代码如下所示:


def test_lock():

    sql = Locks.select().where(Locks.name == 'test')

    sql.execute()


def run_thread():

    test = threading.Thread(target=test_lock)

    test.start()

    test.join()


yappi.set_clock_type('Wall')

yappi.start()

for _ in range(100):

    run_thread()

yappi.stop()


长风秋雁
浏览 103回答 1
1回答

白衣染霜花

Peewee 将连接状态存储在线程局部变量中。因此,每个线程都有一个单独的连接。如果您查看分析输出,我认为具有指导意义的行是:22       100    6.415    0.064    6.618    0.066 /usr/lib64/python2.7/site-packages/MySQLdb/connections.py:62(Connection.__init__您要建立 100 个不同的连接,这很昂贵。据推测,一旦您设置了它们,查询的性能就会提高一些。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python