为什么在多线程中将队列和数据库连接作为参数传递?

时间:2013-06-29 17:25:20

标签: python multithreading

我正在阅读multi-threading priority queue here。在此我不明白为什么workQueue作为参数传递 对于self method课程中的myThread,我们可以直接使用workQueue而不是self.q 使用{{1}}。所以我写了没有它工作,但后来我尝试做同样的连接 database.I打开了一个公共数据库连接,并允许每个线程使用它。但它没有用,(我的更新没有反映在数据库中)。我认为因为线程预先排空了 他们不可能维持连接来执行查询。但后来我给每个线程一个DB连接,我最初传递给self方法。

基本上,我实施了this。令我惊讶的是,这很有用。它与我的做法有何不同?

2 个答案:

答案 0 :(得分:2)

  

在这里我不明白为什么workQueue作为参数传递给类中的self方法   myThread我们可以直接使用workQueue而不是使用self.q

在这个特定示例中,确定您只能引用全局workQueue变量。 但这不是一种非常通用的方法,全局变量可能经常造成混乱。如果您希望对象能够针对不同目的使用多个不同的工作队列,该怎么办?最好只传递您希望对象使用的队列,而不是让对象引用全局变量。

  

。我打开了一个公共数据库连接,并允许每个线程使用它。

数据库连接不是线程安全的,所以当你这样做时,期望发生随机的事情。 正如文档所述:

  

MySQL协议无法使用相同的处理多个线程   立刻连接。 ......这样的一般结果是:不要分享   线程之间的连接。

所以你应该做的是,每个线程使用一个连接,正如你发现的那样正常。这与Queue的使用方式不同,后者在访问示例代码时已正确锁定。

答案 1 :(得分:1)

根据the documentation

  

MySQL协议无法一次使用同一连接处理多个线程。

这就是为什么它不起作用,你不能在线程之间共享数据库连接(至少不是MySQL)。

您链接的示例是为每个线程创建连接:

for thread in range(threads):
    try:
        connections.append(MySQLdb.connect(host=mysql_host, user=mysql_user, passwd=mysql_pass, db=mysql_db, port=mysql_port))