标签:deque socket thread python self tcp recv
笔记,初次登录博客园,操作也不大熟练,尝试对工作进行归纳,限于作者水平,先对问题进行描述,后续会进行完善和补充。
推荐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.解决办法
利用元组的不可修改性,采用掐头加尾的方式,重构了队列,测试表现良好
标签:deque,socket,thread,python,self,tcp,recv 来源: https://www.cnblogs.com/jlnuaa/p/15346135.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。