mysqldb上的Python多处理

时间:2018-05-15 21:16:51

标签: python mysql multithreading multiprocessing

我试图插入以更新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相关的内容?

提前谢谢你,

1 个答案:

答案 0 :(得分:0)

有一种更好的方法可以解决这个问题:

连接器/ Python连接池

  • mysql.connector.pooling模块实现了池化。

  • 在向请求者提供连接时,池会打开许多​​连接并处理线程安全。

  • 连接池的大小可在池创建时配置。此后无法调整大小。

  • 可以有多个连接池。这使应用程序能够支持到不同MySQL服务器的连接池,例如。

Check documentation here

我认为你的并行进程正在耗尽你的mysql连接。