python处理多线程访问mysql
时间: 2023-09-11 19:04:16 浏览: 85
在Python中处理多线程访问MySQL,可以使用以下两种方式:
1. 使用线程池
可以使用线程池来处理多线程访问MySQL,其中线程池的大小需要根据实际情况进行调整,以避免线程过多导致系统资源耗尽。下面是一个使用线程池处理多线程访问MySQL的示例代码:
``` python
import mysql.connector
from concurrent.futures import ThreadPoolExecutor
# 数据库连接信息
config = {
'user': 'root',
'password': 'password',
'host': '127.0.0.1',
'database': 'test'
}
# 创建线程池
executor = ThreadPoolExecutor(max_workers=10)
# 定义处理函数
def query_db(sql, args):
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
cursor.execute(sql, args)
result = cursor.fetchall()
cursor.close()
cnx.close()
return result
# 提交任务到线程池
future = executor.submit(query_db, "SELECT * FROM user WHERE id = %s", (1,))
result = future.result()
print(result)
```
2. 使用线程锁
另一种处理多线程访问MySQL的方式是使用线程锁来保证同一时刻只有一个线程可以访问数据库。下面是一个使用线程锁处理多线程访问MySQL的示例代码:
``` python
import mysql.connector
import threading
# 数据库连接信息
config = {
'user': 'root',
'password': 'password',
'host': '127.0.0.1',
'database': 'test'
}
# 创建锁对象
lock = threading.Lock()
# 定义处理函数
def query_db(sql, args):
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
# 获取锁
lock.acquire()
cursor.execute(sql, args)
result = cursor.fetchall()
cursor.close()
cnx.close()
# 释放锁
lock.release()
return result
# 创建多个线程并启动
threads = []
for i in range(10):
t = threading.Thread(target=query_db, args=("SELECT * FROM user WHERE id = %s", (1,)))
threads.append(t)
t.start()
# 等待所有线程结束
for t in threads:
t.join()
```
需要注意的是,使用线程锁虽然可以避免多个线程同时访问MySQL,但是会降低程序的并发性能。因此,在实际应用中,应根据实际情况选择合适的处理方式。
阅读全文