Python的多线程MySql插件

时间:2011-04-01 18:25:07

标签: python mysql multithreading

下面是我用来将数据上传到MySQL的多线程脚本。使用线程进行多次插入,对我来说听起来不错。

但是没有性能提升。 MySql设置为接受多连接,但是当我检查进程列表时,我没有看到我期望的5-10个连接。 cxn字符串是

有什么方法可以解决这个问题吗?

import  sys, threading, Queue pyodbc

class WorkerThread(threading.Thread):
 def __init__(self, queue):
    threading.Thread.__init__(self)
    self.queue = queue

 def run(self):
    while 1:
        try: # take a job from the queue
            id, null, null2, null3 = self.queue.get_nowait()

        except Queue.Empty:
            raise SystemExit


           In Here I have MySQl connecctions
                *** cxn = pyodbc.connect('DSN=MySQL;PWD=MLML;Option=3') 
            csr = cxn.cursor()
       typical insert , selects Updates


if __name__ == '__main__':
  connections =  25 

  # build a queue with tuples
  queue = Queue.Queue()

        queue.put(row[:3])

   # print queue   

 threads = []
 for dummy in range(connections):
    t = WorkerThread(queue)
    t.start()
    threads.append(t)

# wait for all threads to finish
 for thread in threads:
    thread.join()

Cxn String设置在顶部。我试图在Worker线程中使用cxn字符串,但有很多改进。在工作线程中,MySQL是一个方向性的。表是截断然后插入。每个工人通常只有一张桌子。它的速度快,系统是本地的。但是,我不希望看到mutli连接。

队列= 30-400项。

1 个答案:

答案 0 :(得分:2)

队列中有多少项?

所有操作都在同一张桌子上吗?如果是这样,如果由于表上的锁而选择并插入/更新/删除,则多线程可能无济于事。

从您的例子来看,我们看不到您创建连接的位置。它是在每个线程中创建的还是您为所有线程使用相同的连接?

使用25个线程,您的线程也可能正在争夺队列中的锁定。