gpt4 book ai didi

线程之间的Python共享类实例

转载 作者:太空狗 更新时间:2023-10-30 01:08:27 24 4
gpt4 key购买 nike

我有一个类,它将我的应用程序所需的所有资源(主要是图像)加载到内存中。

然后有几个线程需要通过这个类来访问这些资源。我不希望每个实例都重新加载所有资源,所以我想我使用了单例模式。我是这样做的:

class DataContainer(object):
_instance = None
_lock = threading.Lock()
_initialised = True

def __new__(cls, *args, **kwargs):
with cls._lock:
if not cls._instance:
cls._initialised = False
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance

def __init__(self, map_name = None):

# instance has already been created
if self._initialised:
return

self._initialised = True

# load images

只要我不使用多线程,它就可以正常工作。但是对于多个线程,每个线程都有一个不同的实例。因此使用 4 个线程,它们各自创建一个新实例。我希望所有线程都使用此类的同一个实例,所以资源只加载到内存中一次。

我还尝试在定义类的同一模块中执行此操作,但在类定义之外:

def getDataContainer():
global dataContainer
return dataContainer

dataContainer = DataContainer()

但是每个线程仍然有自己的实例。

我是 python 的新手,如果这是错误的方法请告诉我,我感谢任何帮助

最佳答案

扩展@Will 的评论,如果“共享对象”由父级创建,然后传递给每个线程,所有线程将共享同一个对象。

(关于进程,参见multiprocessing.Manager类,它直接支持共享状态,包括修改。)

import threading, time


class SharedObj(object):
image = 'beer.jpg'


class DoWork(threading.Thread):
def __init__(self, shared, *args, **kwargs):
super(DoWork,self).__init__(*args, **kwargs)
self.shared = shared

def run(self):
print threading.current_thread(), 'start'
time.sleep(1)
print 'shared', self.shared.image, id(self.shared)
print threading.current_thread(), 'done'


myshared = SharedObj()
threads = [ DoWork(shared=myshared, name='a'),
DoWork(shared=myshared, name='b')
]
for t in threads:
t.start()
for t in threads:
t.join()
print 'DONE'

输出:

<DoWork(a, started 140381090318080)> start
<DoWork(b, started 140381006067456)> start
shared beer.jpg shared140381110335440
<DoWork(b, started 140381006067456)> done
beer.jpg 140381110335440
<DoWork(a, started 140381090318080)> done
DONE

请注意,线程 ID 不同,但它们都使用相同的 SharedObj 实例,内存地址以 440 结尾。

关于线程之间的Python共享类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974029/

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