python中deque的坑
笔记,初次登录博客园,操作也不大熟练,尝试对工作进行归纳,限于作者水平,先对问题进行描述,后续会进行完善和补充。
推荐markdown编辑器——小书匠,初学用起来还不错
目录
- 问题描述
- 原因分析
- 问题解决
1. 前言
1.1 问题描述
本人近期使用python做多tcp连接的开发,编程环境及用法如下图所示,TCP连接采用class方式进行封装,数据刷新率约为0.5s,内部采用deque来对历史数据进行滑动平均。主程序中建立了多个tcp类对象,期望类对象各自独立工作。但实际打印发现,类中元素deque之间并未隔离。
| 编程语言 | python |
|---|---|
| 数据协议 | TCP |
| 接口封装 | class |
| 数据存储 | deque |
1.2 程序
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))
1.3 实际测试


2.原因分析
通过id分析,两个确实deque确实是独立的,但是在运行中,并没有显示一定的交互性,具体源引需要后续定位
3.解决办法
利用元组的不可修改性,采用掐头加尾的方式,重构了队列,测试表现良好
本文来自博客园,作者:归渡渐逢春,转载请注明原文链接:https://www.cnblogs.com/jlnuaa/p/15346135.html

浙公网安备 33010602011771号