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

问题描述 投票:0回答:1

我试图在我的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字典。

python multithreading mysql-python
1个回答
0
投票

我不确定你问的是什么。 但通常通过解决方法解决连接问题:

  1. 断开(从主进程)
  2. 叉子
  3. 连接(主人和工人)

它创建了与DB的N个连接,因此您不再需要锁定来进行查询。

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

当然有优化方式:仅在工作者内部重新连接逻辑。

请注意,DB有连接限制,每个连接都需要一些RAM。

© www.soinside.com 2019 - 2024. All rights reserved.