我试图插入以更新mysql数据库中真正重要的数据值,并尝试在进程列表中查看正在进行的操作!
所以我做了以下脚本:
我有一个修改过的db mysql,需要注意连接。一切都工作正常,除非我使用多进程,如果我使用多处理,我在某个时候收到错误,并且#34;丢失了与数据库的连接"。
脚本如:
from mysql import DB
import multiprocessing
def check writing(db):
result = db.execute("show full processlist").fethcall()
for i in result:
if i['State'] == "updating":
print i['Info']
def main(db):
# some work to create a big list of tuple called tuple
sql = "update `table_name` set `field` = %s where `primary_key_id` = %s"
monitor = multiprocessing.Process(target=check_writing,args=(db,)) # I create the monitor process
monitor.start()
db.execute_many(sql,tuple) # I start to modify table
monitor.terminate()
monitor.join
if __name__ == "__main__"
db = DB(host,user,password,database_name) # this way I create the object connected
main(db)
db.close()
我的mysql类的一部分是:
class DB:
def __init__(self,host,user,password,db_name)
self.db = MySQLdb.connect(host=host.... etc
def execute_many(self,sql,data):
c = self.db.cursor()
c.executemany(sql, data)
c.close()
self.db.commit()
正如我之前所说,如果我不尝试在check_writing中执行,那么脚本运行正常!
也许有人可以解释我是什么原因以及如何克服?另外,我在使用map(或map_async)尝试使用threadPool在MySQL中编写时遇到问题。 我是否会遗漏与mysql相关的内容?
提前谢谢你,
答案 0 :(得分:0)
有一种更好的方法可以解决这个问题:
连接器/ Python连接池:
mysql.connector.pooling模块实现了池化。
在向请求者提供连接时,池会打开许多连接并处理线程安全。
连接池的大小可在池创建时配置。此后无法调整大小。
可以有多个连接池。这使应用程序能够支持到不同MySQL服务器的连接池,例如。
我认为你的并行进程正在耗尽你的mysql连接。