笔记,初次登录博客园,操作也不大熟练,尝试对工作进行归纳,限于作者水平,先对问题进行描述,后续会进行完善和补充。
推荐markdown编辑器——小书匠,初学用起来还不错
本人近期使用python做多tcp连接的开发,编程环境及用法如下图所示,TCP连接采用class方式进行封装,数据刷新率约为0.5s,内部采用deque来对历史数据进行滑动平均。主程序中建立了多个tcp类对象,期望类对象各自独立工作。但实际打印发现,类中元素deque之间并未隔离。
编程语言 | python |
---|---|
数据协议 | TCP |
接口封装 | class |
数据存储 | deque |
class TcpClient(): tcp = None # socket句柄 isWorking = 0 # 链路状态 thread_recv = None def __init__(self): super(TcpClient, self).__init__(IP, port, user, pswd) self.tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM) self.tcp.settimeout(4) self.host = IP self.port = port self.user = user self.pswd = pswd # 建立tcp连接 try: addr = (self.host,self.port) self.tcp.connect(addr) except: err = (('ErrNo[0]:connect failed'),) return else: self.isWorking = 1 if not self.thread_recv: self.thread_recv=_thread.start_new_thread(self.tcp_recv,()) socket_recv=b'' def tcp_recv(self): while self.isWorking: try: data=self.tcp.recv(6000) except: time.sleep(0.1) continue else: self.socket_recv += data try: n=self.socket_recv.index(b'spect\0') if len(self.socket_recv)-n<self.infolen+4096: continue except: continue else: info=self.socket_recv[n+8:n+4096] self.fc_decode(self.isWorking,info) queue_average=deque(maxlen=16) def fc_spect(self,id, value): self.queue_average.append(value) print('--%s--%d--'%(self.host,len(self.queue_average)) if __name__ == '__main__': IPs = ['192.168.1.88','192.168.1.89'] port = 32000 user = 'root' pswd = '1' tcps = [] for IP in IPs: tcp = TcpClient(IP, port, user, pswd) if (tcp.isWorking) tcps.append(tcp) for tcp in tcps: print(id(tcp)) print(id(tcp.queue_average))
通过id分析,两个确实deque确实是独立的,但是在运行中,并没有显示一定的交互性,具体源引需要后续定位
利用元组的不可修改性,采用掐头加尾的方式,重构了队列,测试表现良好