python中deque的坑

2021/9/28 9:12:10

本文主要是介绍python中deque的坑,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

笔记,初次登录博客园,操作也不大熟练,尝试对工作进行归纳,限于作者水平,先对问题进行描述,后续会进行完善和补充。
推荐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.解决办法

利用元组的不可修改性,采用掐头加尾的方式,重构了队列,测试表现良好



这篇关于python中deque的坑的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程