Python“命令不同步;你现在不能运行这个命令“
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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字典。
答案
我不确定你问的是什么。 但通常通过解决方法解决连接问题:
- 断开(从主进程)
- 叉子
- 连接(主人和工人)
它创建了与DB的N个连接,因此您不再需要锁定来进行查询。
对于许多ORM,3d步骤是可选的,因为ORM用于在您进行某些查询时自动连接,django do it as well 断开逻辑特定于您使用的ORM。 Django (not tested myself)
当然有优化方式:仅在工作者内部重新连接逻辑。
请注意,DB有连接限制,每个连接都需要一些RAM。
以上是关于Python“命令不同步;你现在不能运行这个命令“的主要内容,如果未能解决你的问题,请参考以下文章