python - 为什么我在 Python 中的线程化 MySQLdb 查询比相同的非线程化查询慢?

标签 python mysql multithreading

我正在构建一个线程类来使用 Python 和 MySQLdb 运行 MySQL 查询。我不明白为什么以线程方式运行这些查询比以非线程方式运行它们要慢。这是我的代码来展示我在做什么。

首先,这是非线程函数。

def testQueryDo(query_list):

    db = MySQLdb.connect('localhost', 'user', 'pass', 'db_name')
    cursor = db.cursor()

    q_list = query_list
    for each in q_list:
        cursor.execute(each)
        results = cursor.fetchall()

    db.close()

这是我的线程类:

class queryThread(threading.Thread):

    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

        self.db = MySQLdb.connect('localhost', 'user', 'pass', 'db_name')
        self.cursor = self.db.cursor()

    def run(self):
        cur_query = self.queue.get()
        self.cursor.execute(cur_query)
        results = self.cursor.fetchall()
        self.db.close()
        self.queue.task_done()

这是处理程序:

def queryHandler(query_list):
    queue = Queue.Queue()

    for query in query_list:
        queue.put(query)

    total_queries = len(query_list)
    for query in range(total_queries):
        t = queryThread(queue)
        t.setDaemon(True)
        t.start()

    queue.join()

我不确定为什么这个线程代码运行得更慢。有趣的是,如果我使用相同的代码,只做一些简单的事情,比如加法,线程代码会显着更快。

我知道我一定遗漏了一些非常明显的东西,但是非常感谢任何支持!

最佳答案

您正在启动 N 个线程,每个线程都创建自己的 MySQL 连接,并且您正在使用同步队列将查询传递给线程。每个线程都阻塞在 queue.get()(获取独占锁)上以获取查询,然后创建到数据库的连接,然后调用 task_done()让下一个线程继续。因此,当线程 1 工作时,N-1 个线程什么都不做。这种锁获取/释放的开销,加上连续创建和关闭多个数据库连接的额外开销加起来。

关于python - 为什么我在 Python 中的线程化 MySQLdb 查询比相同的非线程化查询慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286100/

相关文章:

python - matplotlib - 无法无错误地绘制

python - Flask/Python/WTForms 验证和动态设置 SelectField 选择

mysql - ORDER BY 减慢 mysql 查询速度

android - Kotlin Android Studio 在调用另一个函数之前等待一个函数完成

python - 如何在keras中为给定数据点指定多个标签?

python - 使用高级 Twitter 帐户通过 TwitterAPI 访问用户数据

MySql 索引和查询优化及最短执行时间

mysql - 在内连接之前使用子查询更有效?

java 线程 多线程

C# SerialPort DataReceived 事件未更新主 UI