在将 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()
1 回答

白衣染霜花
TA贡献1796条经验 获得超10个赞
Peewee 将连接状态存储在线程局部变量中。因此,每个线程都有一个单独的连接。如果您查看分析输出,我认为具有指导意义的行是:
22 100 6.415 0.064 6.618 0.066 /usr/lib64/python2.7/site-packages/MySQLdb/connections.py:62(Connection.__init__
您要建立 100 个不同的连接,这很昂贵。
据推测,一旦您设置了它们,查询的性能就会提高一些。
添加回答
举报
0/150
提交
取消