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

Python 为什么在多线程中传递队列和数据库连接作为参数?,python,multithreading,Python,Multithreading,我正在阅读多线程优先级队列。在这种情况下,我不理解为什么workQueue作为参数传递 对于类myThread中的self方法,我们可以直接使用workQueue而不是 使用self.q。所以我写了一篇没有它的文章,但后来我试着用同样的方法连接到 我打开了一个公共数据库连接,并允许每个线程使用它。但它不起作用(我的更新并没有反映在数据库中)。我认为线程是先发制人的 他们不可能保持连接以执行查询。但随后我给每个线程一个DB连接,我最初将其传递给self方法 基本上,我实现了。令我惊讶的是,这起作用

我正在阅读多线程优先级队列。在这种情况下,我不理解为什么
workQueue
作为参数传递 对于类
myThread
中的
self方法
,我们可以直接使用
workQueue
而不是 使用
self.q
。所以我写了一篇没有它的文章,但后来我试着用同样的方法连接到 我打开了一个公共数据库连接,并允许每个线程使用它。但它不起作用(我的更新并没有反映在数据库中)。我认为线程是先发制人的 他们不可能保持连接以执行查询。但随后我给每个线程一个DB连接,我最初将其传递给self方法

基本上,我实现了。令我惊讶的是,这起作用了。它与我正在做的有什么不同?

根据:

MySQL协议不能同时处理使用同一连接的多个线程

这就是它不起作用的原因,您不能在线程之间共享db连接(至少对于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))
根据:

MySQL协议不能同时处理使用同一连接的多个线程

这就是它不起作用的原因,您不能在线程之间共享db连接(至少对于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))
在本文中,我不理解为什么workQueue作为参数传递给类中的self方法 myThread我们可以直接使用workQueue而不是self.q

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

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

数据库连接不是线程安全的,所以当您这样做时,可能会发生随机事件。 如文件所述:

MySQL协议不能使用同一个线程处理多个线程 立即连接。。。总的结果是:不要分享 线程之间的连接

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

在本文中,我不理解为什么workQueue作为参数传递给类中的self方法 myThread我们可以直接使用workQueue而不是self.q

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

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

数据库连接不是线程安全的,所以当您这样做时,可能会发生随机事件。 如文件所述:

MySQL协议不能使用同一个线程处理多个线程 立即连接。。。总的结果是:不要分享 线程之间的连接


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

@感谢您消除我的疑虑,干杯@谢谢你消除我的疑虑,干杯@非常感谢您的详细介绍explanation@thanks有很多这样详细的解释