我正在阅读multi-threading priority queue
here。在此我不明白为什么workQueue
作为参数传递
对于self method
课程中的myThread
,我们可以直接使用workQueue
而不是self.q
使用{{1}}。所以我写了没有它工作,但后来我尝试做同样的连接
database.I打开了一个公共数据库连接,并允许每个线程使用它。但它没有用,(我的更新没有反映在数据库中)。我认为因为线程预先排空了
他们不可能维持连接来执行查询。但后来我给每个线程一个DB连接,我最初传递给self方法。
基本上,我实施了this。令我惊讶的是,这很有用。它与我的做法有何不同?
答案 0 :(得分:2)
在这里我不明白为什么workQueue作为参数传递给类中的self方法 myThread我们可以直接使用workQueue而不是使用self.q
在这个特定示例中,确定您只能引用全局workQueue
变量。
但这不是一种非常通用的方法,全局变量可能经常造成混乱。如果您希望对象能够针对不同目的使用多个不同的工作队列,该怎么办?最好只传递您希望对象使用的队列,而不是让对象引用全局变量。
。我打开了一个公共数据库连接,并允许每个线程使用它。
数据库连接不是线程安全的,所以当你这样做时,期望发生随机的事情。 正如文档所述:
MySQL协议无法使用相同的处理多个线程 立刻连接。 ......这样的一般结果是:不要分享 线程之间的连接。
所以你应该做的是,每个线程使用一个连接,正如你发现的那样正常。这与Queue
的使用方式不同,后者在访问示例代码时已正确锁定。
答案 1 :(得分:1)
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))