ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python中deque的坑

2021-09-28 07:32:32  阅读:181  来源: 互联网

标签:deque socket thread python self tcp recv


笔记,初次登录博客园,操作也不大熟练,尝试对工作进行归纳,限于作者水平,先对问题进行描述,后续会进行完善和补充。
推荐markdown编辑器——小书匠,初学用起来还不错

目录

  1. 问题描述
  2. 原因分析
  3. 问题解决

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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有