Python3 多线程(连接池)操作MySQL插入数据

2023-12-15Python编程
248

下面我将详细介绍如何使用Python3多线程(连接池)操作MySQL插入数据。

准备工作

首先,我们需要安装Python3以及对应的MySQL库。可以使用以下命令进行安装:

pip install pymysql

创建数据库连接池

使用连接池可以最大化利用已经建立的连接,提高程序的性能和并发能力。下面是创建连接池的示例代码:

import pymysql
from DBUtils.PooledDB import PooledDB

pool = PooledDB(
    creator=pymysql, 
    mincached=1, 
    maxcached=10, 
    host='localhost', 
    port=3306, 
    user='root', 
    password='password', 
    database='mydb', 
    charset='utf8'
)

在这个示例中,我们使用了DBUtils.PooledDB库来创建连接池。mincached参数表示连接池中最少保持的连接数,maxcached参数表示连接池中最大的连接数。使用该库创建的pool对象可以用来获取数据库连接。

连接池实现多线程插入数据

下面是连接池实现多线程插入数据的示例代码:

from concurrent.futures import ThreadPoolExecutor


def insert(data):
    query = "INSERT INTO mytable (name, age) VALUES (%s, %s)"
    conn = pool.connection()
    cursor = conn.cursor()
    cursor.execute(query, data)
    conn.commit()
    cursor.close()
    conn.close()

with ThreadPoolExecutor(max_workers=10) as executor:
    futures = [executor.submit(insert, ('Alice', 25)) for _ in range(50)]

在这个示例中,我们使用了Python的concurrent.futures库来实现多线程操作MySQL。ThreadPoolExecutor对象可以用来创建一个线程池,其中max_workers表示线程池中线程的最大数量。

executor.submit()方法用于提交一个任务,该方法会立即返回一个Future对象。在这个示例中,我们提交了50个插入数据的任务,并指定了参数值('Alice', 25)

insert函数中,我们使用连接池来获取数据库连接,执行插入操作并关闭数据库连接。使用连接池可以显著提高程序的性能和并发能力。

示例说明

以下是两个使用连接池多线程插入数据的示例:

示例1:批量插入数据

from concurrent.futures import ThreadPoolExecutor


def insert_many(data_list):
    query = "INSERT INTO mytable (name, age) VALUES (%s, %s)"
    conn = pool.connection()
    cursor = conn.cursor()
    cursor.executemany(query, data_list)
    conn.commit()
    cursor.close()
    conn.close()

data = [('Alice', 25), ('Bob', 30), ('Charlie', 35), ('David', 40)]
with ThreadPoolExecutor(max_workers=1) as executor:
    futures = [executor.submit(insert_many, (data[i:i+2])) for i in range(0, len(data), 2)]

在这个示例中,我们使用executemany()方法批量插入数据。在insert_many函数中,我们传入了一个包含多个数据的列表data_list,使用executemany()方法批量插入数据。

在主程序中,我们使用一个线程处理相邻的两个数据项,通过循环遍历将数据分组并提交到线程池处理。

示例2:数据插入失败重试

from concurrent.futures import ThreadPoolExecutor, as_completed


def insert_with_retry(data):
    query = "INSERT INTO mytable (name, age) VALUES (%s, %s)"
    conn = pool.connection()
    cursor = conn.cursor()
    for i in range(3):
        try:
            cursor.execute(query, data)
            conn.commit()
            break
        except Exception as e:
            print(f"Insert failed, retrying ({i+1}/3)")
    cursor.close()
    conn.close()

data = [('Alice', 25), ('Bob', 30), ('Charlie', 'invalid'), ('David', 40)]
with ThreadPoolExecutor(max_workers=2) as executor:
    futures = [executor.submit(insert_with_retry, d) for d in data]

for future in as_completed(futures):
    try:
        future.result()
    except Exception as e:
        print(f"Insert failed: {e}")

在这个示例中,我们在insert_with_retry函数中增加了数据插入失败重试的逻辑。在主程序中,我们提交了包含多个数据的任务列表,并使用as_completed()函数迭代多个Future对象并尝试获取其结果。

由于数据中包含了一个无效的年龄值,在插入操作中将会抛出异常。在这种情况下,我们将尝试最多三次执行插入操作。

以上就是Python3多线程(连接池)操作MySQL插入数据的完整攻略。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103