0

multi-threading priority queue 我在这里读书。在这我不明白为什么workQueue作为参数传递给我们可以直接使用而不是使用的self methodin 类myThreadworkQueueself.q。所以我在没有它的情况下写了,但后来我尝试为连接到数据库做同样的事情。我打开了一个公共数据库连接并允许每个线程使用它。但它不起作用,(我的更新没有反映在数据库中)。我认为由于线程被抢占,它们不可能保持连接来执行查询。但是后来我给了每个线程一个我最初传递给 self 方法的数据库连接。

基本上,我实现了这个。令我惊讶的是,这奏效了。它与我所做的有什么不同?

4

2 回答 2

2

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

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

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

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

MySQL 协议不能同时使用同一个连接处理多个线程。...一般的结果是:不要在线程之间共享连接。

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

于 2013-06-29T18:05:33.577 回答
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))
于 2013-06-29T18:03:46.827 回答