Python"命令不同步;你现在不能运行这个命令"

时间:2017-07-18 19:19:17

标签: python multithreading mysql-python

我正在尝试在我的python脚本中实现多线程,它将一个字典列表分成多个列表,并通过为每个线程创建一个单独的数据库连接来更新数据库。

def updateResource(self, data, SELECT_QUERY, UPDATE_QUERY, CONTACTS_QUERY, CONTACT_ER_QUERY, INSERT_QUERY):
    #import pdb; pdb.set_trace()
    self.select_query = SELECT_QUERY
    self.update_query = UPDATE_QUERY
    self.contacts_query = CONTACTS_QUERY
    self.contact_er_query = CONTACT_ER_QUERY
    self.insert_query = INSERT_QUERY

    for i in range(len(data)):
        self.arg1 = data[i]["system_name"]
        self.arg2 = data[i]["fdc_inv_sa_team"]
        try:
            query1_row = self.cursor.execute(self.select_query %(self.arg1))
            if query1_row:
                '''
                run update and insert queries
                commit
                '''
            else:
                ...
        except MySQLdb.Error as e:
            logger.error("Error %d: %s" % (e.args[0],e.args[1]))
        except Exception, e:
            logger.error("Error : ", str(e))

运行线程 -

def createThread(self, chunks, obj):
    for i in range(len(chunks)):
        cnx = MySQLdb.connect(host, user, passwd, db)
        cnx.autocommit(True)
        cursor = cnx.cursor()
        new_thread = myThread(obj, cnx, cursor, chunks[i])
        new_thread.start()
        threads.append(new_thread)
    for new_thread in threads:
        new_thread.join()

线程类 -

class myThread(threading.Thread):
    def __init__(self, obj, conn, cur, data_to_deal):
        threading.Thread.__init__(self)
        self.obj = obj
        self.conn = conn
        self.cur = cur
        self.data_to_deal = data_to_deal

    def run(self):
        self.obj.updateResource(self.data_to_deal, SELECT_QUERY, UPDATE_QUERY, CONTACTS_QUERY, CONTACT_ER_QUERY, INSERT_QUERY)

实现锁会删除此错误但会使脚本变慢,因为列表中有16k字典。

1 个答案:

答案 0 :(得分:0)

我不确定你问什么。
但通常,通过执行解决方法

解决了连接问题
  1. 断开连接(与主进程断开连接)
  2. 连接(无论是在主机中还是在工人中)

它创建了与数据库的N个连接,因此您不再需要为查询锁定。

对于许多ORM来说,3d步骤是可选的,因为当您执行某些查询时,ORM会自动连接,django do it as well
断开逻辑特定于您使用的ORM。 Django (not tested myself)

当然有优化的方法:仅在工作线程内部进行重新连接逻辑。

请注意,DB有连接限制,结束每个连接都会占用一些RAM。