我正在开发一个windows服务来监视来自控制系统的信号。我用两个类(IOSignal和Control)对系统进行了建模。每个控件实例都有一些与之关联的IOSignals实例。当与特定控件关联的所有iosignal都处于特定状态时,我希望该服务执行某些操作。在我的实际代码中,它将在数据库中注册此事件。为了解释我的问题,我为我的原始代码创建了一个非常简化的版本。 问题是,当它作为服务运行时,我希望存储所有控件和IOSignal实例的状态,这样当我重新启动服务时,我可以“记住”系统停止时的状态。我用泡菜来做这个。似乎pickling部分正在工作,因为显然我可以在另一个脚本中打开文件并检索对象的信息。 我的系统的复杂性在于,我在每个控件对象中都存储了IOSignals实例,反之亦然。 当我启动服务时,服务似乎可以正常工作,但是当我重新启动它时,我开始收到错误消息,表明重新创建的对象没有某些属性(主要是'd'和'logger') 我重载了getstae和setstate方法,试图使pickle正常工作,但我认为我遗漏了一些东西。我遵循了python文档(https://docs.python.org/2.0/lib/pickle-example.html)中给出的说明
这是我的类的代码(我将它们保存在一个名为观察者.py)在
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 2 11:07:28 2017
@author: me
"""
from logging import getLogger
#import logging
class IOSignal(object):
def __init__(self,tag,val='True'):
self.tag=tag
self.value=val
self.CONTROLS=[]
#logger
self.logger=getLogger('teste.IOSignals')
# dict to serialize
self.d={}
self.d['tag']=self.tag
self.d['value']=self.value
self.d['CONTROLS']=self.CONTROLS
def getTag(self):
return self.tag
def getValue(self):
return self.value
def UpdateIOSinal(self,val):
self.value=val
try:
for control in self.CONTROLS:
#self.logger.debug('updating controls')
control.update()
except Exception as e:
self.logger.error("Error updating signal - ErrMsg -> {}".format(str(e)))
def AppendControl(self,control):
self.CONTROLS.append(control)
def UpdateControls(self):
for control in self.CONTROLS:
control.update()
def __getstate__(self):
return self.d
def __setstate__(self, d):
self.tag=d['tag']
self.value=d['value']
self.CONTROLS=d['CONTROLS']
self.__dict__= d
class Control(object):
def __init__(self,tag,state=False):
self.tag=tag
self.state=state
self.IOSignals={}
#logger
self.logger=getLogger('teste.CONTROLS')
# dict to serialize
self.d={}
self.d['tag']=self.tag
self.d['state']=self.state
self.d['IOSignals']=self.IOSignals
def getTag(self):
return self.tag
def getState(self):
return self.state
def register_signal(self,signal):
self.IOSignals[len(self.IOSignals)]=signal
def update(self):
try:
I=len([e.value for e in self.IOSignals.values() if e.value=='False'])
if I==len(self.IOSignals):
self.logger.info("Control {} actuated".format(self.tag))
except Exception as e:
self.logger.error("Error updating Contro - ErrMsg -> {}".format(str(e)))
def __getstate__(self):
return self.d
def __setstate__(self, d):
self.tag=d['tag']
self.state=d['state']
self.IOSignals=d['IOSignals']
self.__dict__= d
下面是创建服务和使用Observer的代码。我叫它teste_服务.py 要安装它,请在命令行中输入以下命令“python c:\pathtofile\teste_服务.py安装”并在Windows服务中运行。 服务的名称是TEST_Event_service。在
^{pr2}$这是日志记录集
[loggers]
keys=root,teste
[handlers]
keys=logfile,consoleHandler
[formatters]
keys=simpleFormatter,logfileformatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_teste]
level=DEBUG
handlers=logfile
qualname=teste
propagate=0
[formatter_logfileformatter]
format=%(asctime)s %(name)-12s: %(levelname)s %(message)s
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_logfile]
class=handlers.RotatingFileHandler
level=DEBUG
args=(r'C:\tier3\teste\pyteste.log','a',5000000,20)
formatter=logfileformatter
我认为我的问题在于getstate和setstate定义。在
下面是我收到的错误消息的示例。在
2017-08-02 22:58:00,348 teste.SERVICE: ERROR Error saving cache - ErrMsg -> 'IOSignal' object has no attribute 'd'
2017-08-02 22:58:10,366 teste.SERVICE: ERROR Unexpected Error - 'IOSignal' object has no attribute 'logger'
有人知道我的问题在哪里?在
我设法找到了一个不是我想要的解决方案。由于实例没有被完美地重新创建,所以每次服务运行时我都会创建所有实例,并检查是否有缓存文件。如果有,我用缓存中的信息调整实例状态。这是修改后的代码观察者.py. 我创建了新的方法来设置我需要的值。在
相关问题 更多 >
编程相关推荐