python – 我应该如何处理twisted.application.internet.ClientService中的重新连接?

python – 我应该如何处理twisted.application.internet.ClientService中的重新连接?,第1张

概述我试图在扭曲的应用程序中使用 recently introduced twisted.application.internet.ClientService类,使用pymodbus进行简单的modbus-tcp轮询.我觉得我的问题与我正在使用的modbus协议无关,因为我使用较低级别的扭曲API创建了许多其他工作原型;但是这个新的ClientService看起来完全符合我的需求,因此应该减少我的代码 我试图在扭曲的应用程序中使用 recently introduced 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中的重新连接?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1196128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存