gpt4 book ai didi

Python:跨线程共享类变量

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:03 27 4
gpt4 key购买 nike

我有一个计数器(training_queue)在一个类的许多实例之间共享。该类继承了threading.Thread,所以实现了一个run()方法。当我调用 start() 时,我希望每个线程都递增此计数器,因此当它达到限制时不再启动线程。但是,没有线程修改该变量。这是代码:

class Engine(threading.Thread):

training_mutex = threading.Semaphore(MAX_TRAIN)
training_queue = 0
analysis_mutex = threading.Semaphore(MAX_ANALYSIS)
analysis_queue = 0
variable_mutex = threading.Lock()


def __init__(self, config):
threading.Thread.__init__(self)
self.config = config
self.deepnet = None
# prevents engine from doing analysis while training
self.analyze_lock = threading.Lock()

def run(self):
with self.variable_mutex:
self.training_queue += 1
print self.training_queue
with self.training_mutex:
with self.analyze_lock:
self.deepnet = self.loadLSTM3Model()

我用锁保护 training_queue,所以它应该是线程安全的。然而,如果我打印它的值,它总是 1。在这种情况下线程如何影响变量范围?

最佳答案

您对线程之间如何共享状态的理解是正确的。但是,您使用的是实例属性“training_queue”而不是类属性“training_queue”。

也就是说,您始终将每个新对象的 training_queue 设置为 1。

例如:

import threading

class Engine(threading.Thread):
training_queue = 0
print_lock = threading.Lock()

def __init__(self, config):
threading.Thread.__init__(self)

def run(self):
with Engine.print_lock:
self.training_queue += 1
print self.training_queue

Engine('a').start()
Engine('b').start()
Engine('c').start()
Engine('d').start()
Engine('e').start()

将返回:

1
1
1
1
1

但是:

import threading

class Engine(threading.Thread):
training_queue = 0
print_lock = threading.Lock()

def __init__(self, config):
threading.Thread.__init__(self)

def run(self):
with Engine.print_lock:
Engine.training_queue += 1 # <-here
print self.training_queue

Engine('a').start()
Engine('b').start()
Engine('c').start()
Engine('d').start()
Engine('e').start()

返回:

1
2
3
4
5

注意 self.training_queue 与 Engine.training_queue

顺便说一句。我认为 python 中的 += 应该是原子的,所以我不会为锁而烦恼。但是,在上面的示例中,并没有使用锁定来打印到标准输出。

关于Python:跨线程共享类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37806858/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com