【发布时间】:2014-07-28 12:48:59
【问题描述】:
过去几个小时我一直在尝试解决这个问题,但我就是不知道我做错了什么!
我有一个 python 文件:
REFRESH_RATE=10.0
MAX_SECONDS=30
class user_manager:
users={}
def __init__(self,queue,sign_properties):
self.properties=sign_properties
self.queue=queue
self.lock=threading.Lock()
t=threading.Thread(target=user_timer,args=(self.lock,))
t.daemon=True
t.start()
def add_user(self,macaddr,user_properties):
self.lock.acquire()
user_manager.users[macaddr]=user(user_properties)
self.lock.release()
def user_exists(self, macaddr):
if macaddr in user_manager.users:
return True
return False
def update_rssi_for_user(self, macaddr,rssi):
self.lock.acquire()
user_manager.users[macaddr].update_rssi(rssi)
self.lock.release()
def get_users(self):
return user_manager.users
def user_timer(lock):
while True:
print 'Test'
lock.acquire()
print user_manager.users
lock.release()
format = '%H:%M:%S'
for user in user_manager.users:
first_seen=user_manager.users[user].get_first_seen()
current_time=str(datetime.datetime.now().time())
difference=datetime.strptime(current_time, format) - datetime.strptime(first_seen[1], format)
print 'difference'+str(difference.seconds)
if difference.seconds >30:
user.expire()
del user_manager.users[user]
time.sleep(REFRESH_RATE)
这个想法是 user_manager 类有一个名为 users 的类变量,它在运行时填充 - 这非常有效。
然后我有一个名为 user_timer 的线程函数,它从 user_manager 启动,它管理这些用户并在 X 时间后使它们过期。由于不相关,因此已从本文的上下文中删除。
目前,每次调用 user_timer 时,user_manager.users 的结果都是一个空字典 {},但从该文件外部其他模块可以看到已填充类变量。
我到底做错了什么,为什么会这样?
詹姆斯。
编辑:
调用类的构造函数:
class api_wrapper(object):
def __init__(self,queue,display_queue,macaddr):
self.properties={}
self.queue=queue
self.register_sign(macaddr)
self.user_manager=user_manager(self.queue,self.properties)
self.nearby_devices={}
self.display_queue=display_queue
从上面的类调用函数:
def handle_address(self,address,postcode):
if self.user_manager is None:
return
if self.user_manager.user_exists(address):
#print user_manager.users
self.user_manager.update_address_for_user(address,postcode)
#self.display_queue.put(self.user_manager.get_users())
elif macaddr not in self.nearby_devices:
if self.check_address(address) is False:
self.nearby_devices[address]=postcode
【问题讨论】:
-
任何问题,包括“这已从本文的上下文中删除,因为它不相关”。通常意味着相关代码已被删除。我的猜测是您正在使用
multiprocessing模块,并且对user_timer的每次调用都发生在一个新进程中。 -
好的,我会将代码添加到帖子中 - 但我正在对多处理模块进行 0 次调用...@Duncan 编辑完成。
-
@James 你必须为我们提供足够的代码来重现问题。现在看起来不像你有。
-
@dano 你想看什么?程序的结构有点复杂,需要发布更多的代码。但是,如果有帮助,我可以描述架构吗?我有三个使用队列进行通信的进程。提供的代码是在一个管理网络通信的进程中,user_manager模块是在这个进程中创建的,线程也是在这个进程中创建的。这样可以吗?
-
@James,理想情况下,您会给我们提供在我们自己的机器上重现问题所需的最少代码量。
标签: python multithreading class class-variables