twisted.application.internet.ClientService
类,使用pymodbus进行简单的modbus-tcp轮询.我觉得我的问题与我正在使用的modbus协议无关,因为我使用较低级别的扭曲API创建了许多其他工作原型;但是这个新的ClIEntService看起来完全符合我的需求,因此应该减少我的代码占用空间并保持整洁,如果我可以让它工作. 我的测试显示ClIEntService正如预期的那样处理重新连接,并且我可以轻松访问第一个连接协议.我遇到的问题是为重新连接获取后续的Protocol对象.这是我遇到问题的代码的简化版本:
from twisted.application import internet,servicefrom twisted.internet.protocol import ClIEntFactoryfrom twisted.internet import reactor,endpointsfrom pymodbus.clIEnt.async import ModbusClIEntProtocolclass ModbusPollingService(internet.ClIEntService): def __init__(self,addrstr,numregs=5): self.numregs=numregs internet.ClIEntService.__init__(self,endpoints.clIEntFromString(reactor,addrstr),ClIEntFactory.forProtocol(ModbusClIEntProtocol)) def startService(self): internet.ClIEntService.startService(self) self._pollWhenConnected() def _pollWhenConnected(self): d = self.whenConnected() d.addCallback(self._connected) d.addErrback(self._connfail) def _connected(self,p): self._log.deBUG("connected: {p}",p=p) self._mbp = p self._poll() return True def _connfail(self,failstat): self._log.failure('connection failure',failure=failstat) self._mbp = None self._pollWhenConnected() def _poll(self): self._log.deBUG("poll: {n}",n=self.numregs) d = self._mbp.read_holding_registers(0,self.numregs) d.addCallback(self._regs) d.addErrback(self._connfail) def _regs(self,res): self._log.deBUG("regs: {r}",r=res.registers) # Do real work of dealing storing registers here reactor.callLater(1,self._poll) return resapplication = service.Application("ModBus Polling Test")mbpollsvc = ModbusPollingService('tcp:127.0.0.1:502')mbpollsvc.setServiceParent(application)
当连接失败时(无论出于何种原因),从read_holding_registers()返回的延迟的错误被调用,意图是我的服务可以放弃该协议并返回到等待新连接的状态由whenConnected返回协议()回调…然而,似乎正在发生的事情是ClIEntService尚未意识到连接已经死亡并且返回了相同的断开连接的协议,给我一个完整的日志:
2016-05-05 17:28:25-0400 [-] connected: <pymodbus.clIEnt.async.ModbusClIEntProtocol object at 0x000000000227b558>2016-05-05 17:28:25-0400 [-] poll: 52016-05-05 17:28:25-0400 [-] connection failure Traceback (most recent call last): Failure: pymodbus.exceptions.connectionexception: Modbus Error: [Connection] ClIEnt is not connected2016-05-05 17:28:25-0400 [-] connected: <pymodbus.clIEnt.async.ModbusClIEntProtocol object at 0x000000000227b558>2016-05-05 17:28:25-0400 [-] poll: 52016-05-05 17:28:25-0400 [-] connection failure Traceback (most recent call last): Failure: pymodbus.exceptions.connectionexception: Modbus Error: [Connection] ClIEnt is not connected
或者非常相似,请注意重复的ModbusClIEntProtocol对象地址.
我很确定我可能只是为这个API做了一个糟糕的模式选择,但我已经迭代了几个不同的可能性,比如创建我自己的基于ModbusClIEntProtocol的协议和工厂,并完全处理轮询机制类;但是通过持久化的配置和机制以存储轮询数据的方式感觉有点凌乱,似乎在ClIEntService级别或以上处理这个是一个更干净的方法,但我无法找出跟踪的最佳方法目前连接的协议.我想我真正想要的是在扩展轮询情况下使用ClIEntService类的最佳实践建议.
解决方法 你不是在我可以看到的任何地方调用self.transport.loseConnection()来响应你的轮询,所以只要扭曲可以告诉你,你实际上并没有断开连接.可能以后,当你停止对旧运输做任何事情时,但到那时你已经忘记了事情. 总结以上是内存溢出为你收集整理的python – 我应该如何处理twisted.application.internet.ClientService中的重新连接?全部内容,希望文章能够帮你解决python – 我应该如何处理twisted.application.internet.ClientService中的重新连接?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)