Python使用queu运行多个mysql插入而不等待完成

2024-07-07 07:28:00 发布

您现在位置:Python中文网/ 问答频道 /正文

最基本的问题。我有一个多维列表,我是从csv生成的。我有它的运作方式:

data = [['hello', 'world'],['hello','universe']]
for i in data:
    try:
        cursor.execute("""INSERT INTO MYTABLE (word1,word2) VALUES ('%s','%s')""" % (i[0],i[1]))
        cursor.execute("""INSERT random command here""" % ())
        conn.commit()
    except Exception:
        conn.rollback()

这很管用。但是,在尝试提交下一个响应之前,它必须等待响应。一次只执行一个查询需要相当长的时间,所以我希望使用queue/threading,以便一次发送多个这样的查询(10个左右),同时它要处理几百个这样的查询列表。在

我读过几本关于队列和多线程的教程,但是我不知道如何处理列表中的特定项(甚至不知道队列和多线程是如何工作的)。我尝试了以下方法(以及一些其他变体),但无法理解如何使用这种方法来处理我的价值观:

^{pr2}$

我不确定如何处理“stuff”函数内数组中的其他项,因此,我一直在猜测。我对队列/线程的理解一般,但是我发现google上的所有教程都是一维数组。如果你有任何见解,我会很感激的,因为我一直在努力让我的头脑围绕这个问题。谢谢。在

编辑:更新的例子更具体。我有一个唯一的票号列表,它首先查询数据库中没有的票号。那些不在的,会被放入多维列表中。然后我尝试将insert插入到live表中,但是如果其中一个键标识符不匹配,它将抛出一个异常,然后我希望它们回滚并插入到另一个表中


Tags: csv方法hello列表worldexecutedata队列
1条回答
网友
1楼 · 发布于 2024-07-07 07:28:00

最后,我将所有变量打包到q.put()中,并在函数中拆分它们。我想还有更好的办法,但这是我能想到的最好的办法。我也加入了Blender的建议。希望这能帮助其他人:

def stuff(q):
    while True:
        try:
            one, two = q.get().split(',')
            cursor.execute("""INSERT INTO MYTABLE (word1,word2) VALUES (%s,%s)""", (one,two)))
            cursor.execute("""Random command here""", ())
            conn.commit()
        exception Exception:
            conn.rollback()
            cursor.execute(""""insert statement here""", ())            
        q.task_done()

q = Queue(maxsize=0)
num_threads = 2
array = [['Hello','World'],['This','Is']]

for i in range(num_threads):
    worker = Thread(target=stuff, args=(q,))
    worker.setDaemon(True)
    worker.start()

for x in array:
    q.put(x[0]+','+x[1])

相关问题 更多 >