在將 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
提交
取消