首页 / PYTHON / Python在线程之间共享类实例
Python在线程之间共享类实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python在线程之间共享类实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2010字,纯文字阅读大概需要3分钟。
内容图文
![Python在线程之间共享类实例](/upload/InfoBanner/zyjiaocheng/794/275ea1676f9145b189615b5ac4d97ef5.jpg)
我有一个类,它将所有资源加载到我的应用程序所需的内存中(主要是图像).
然后几个线程需要通过这个类访问这些资源.
我不希望每个实例都重新加载所有资源,所以我认为我使用的是Singleton模式.
我是这样做的:
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在线程之间共享类实例全部内容,希望文章能够帮你解决Python在线程之间共享类实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。