python和队列中的线程会导致内存泄漏或内存错误
我已经在python中使用多线程和队列创建了简单的代码。我有一个主线程,它一直在队列中添加数据(队列maxsize为2000),将有5个不同的线程从队列中取出,并在某个特定通道发布到redis 代码运行得非常好,但在5或6小时后,发布机制会变慢。 当队列大小达到maxsize时,用于从队列中删除数据的线程速度变慢,并开始抛出缓冲区溢出错误。将数据添加到队列的速度与开始时相同 该问题在不同配置的Linux系统上发生的方式不同。如何识别它抛出的错误类型?如何调试这个问题 如前所述,代码非常简单,其中主线程需要一个接一个地将数据添加到队列中,其他5个线程可以一个接一个地将数据从队列中取出 共享代码python和队列中的线程会导致内存泄漏或内存错误,python,multithreading,memory-leaks,queue,Python,Multithreading,Memory Leaks,Queue,我已经在python中使用多线程和队列创建了简单的代码。我有一个主线程,它一直在队列中添加数据(队列maxsize为2000),将有5个不同的线程从队列中取出,并在某个特定通道发布到redis 代码运行得非常好,但在5或6小时后,发布机制会变慢。 当队列大小达到maxsize时,用于从队列中删除数据的线程速度变慢,并开始抛出缓冲区溢出错误。将数据添加到队列的速度与开始时相同 该问题在不同配置的Linux系统上发生的方式不同。如何识别它抛出的错误类型?如何调试这个问题 如前所述,代码非常简单,其中
导入redis
导入日志记录
导入系统
logging.basicConfig(级别=logging.DEBUG)
redisPub=redis.StrictRedis(主机=127.0.0.1',端口=6379)
def main():
尝试:
recv_sock=socket.socket(socket.AF_INET,socket.sock_RAW,socket.IPPROTO_UDP)
收银机装订(“”,8000))
接收插座锁定(0)
接收插座设置超时(5)
除例外情况外,e:
exc_类型,exc_对象,exc_tb=sys.exc_info()
日志记录错误(“套接字连接不成功”)
打印“程序暂停”
sys.exit()
sendThEvent=threading.Event()
sendThEvent.clear()
sendPktQ=Queue.Queue(maxsize=2000)
对于范围(0,5)内的i:
thSend=threading.Thread(name='sendThread',target=sendThread,args=(sendPktQ,sendThEvent))
thSend.setDaemon(True)
thSend.start()
打包搜索=0
尽管如此:
尝试:
recvData,recvAddr=recv_sock.recvfrom(2048)
sendPktQ.put(recvData)
打包搜索+=1
其他:
logging.error(“有一些错误”)
除socket.timeout外:
持续
除例外情况外,e:
exc_类型,exc_对象,exc_tb=sys.exc_info()
logging.error(e)
def sendThread(sendPktQ,listenvent):
如果sendPktQ==无:
通过
其他:
尽管如此:
instanceSentCnt+=1
如果sendPktQ.qsize()小于1:
event_is_set=listenvent.wait(0)
packetDict=sendPktQ.get()
data=redisPub.publish('chnlName',packetToSend)
logging.info(“数据包大小已达到=============================================================================%s------------%s”%(len(packetToSend),data))
如果名称=“\uuuuu main\uuuuuuuu”:
main()
任何人的输入都将受到高度赞赏。我看到一个sendPktQ.get()
,但没有sendPktQ.task\u done()
,例如:
async def\u dispatch\u数据包(self,destination=None)->None:
“”“除非处于仅侦听模式,否则发送命令。”“”
如果不是self.command_queue.empty():
cmd=self.command\u queue.get()
如果不是(目标为None或self.config.get(“仅侦听”):
destination.write(bytearray(f“{cmd}\r\n”.encode(“ascii”))
等待异步睡眠(0.05)
self.command\u queue.task\u done()
请参见您能提供一些吗?您好,我分享了代码片段。请给出任何见解。
import redis
import logging
import sys
logging.basicConfig(level = logging.DEBUG)
redisPub = redis.StrictRedis(host='127.0.0.1', port=6379)
def main():
try:
recv_sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP)
recv_sock.bind(("", 8000))
recv_sock.setblocking(0)
recv_sock.settimeout(5)
except Exception,e:
exc_type, exc_obj, exc_tb = sys.exc_info()
logging.error("Socket Connection Unsuccessful")
print "Program halted."
sys.exit()
sendThEvent = threading.Event()
sendThEvent.clear()
sendPktQ = Queue.Queue(maxsize=2000)
for i in range(0,5):
thSend = threading.Thread(name = 'sendThread', target = sendThread , args = (sendPktQ,sendThEvent))
thSend.setDaemon(True)
thSend.start()
packetsCounting = 0
while True:
try:
recvData, recvAddr = recv_sock.recvfrom(2048)
sendPktQ.put(recvData)
packetsCounting += 1
else:
logging.error("There is some error")
except socket.timeout:
continue
except Exception,e:
exc_type, exc_obj, exc_tb = sys.exc_info()
logging.error(e)
def sendThread(sendPktQ,listenEvent):
if sendPktQ == None:
pass
else:
while True:
instanceSentCnt += 1
if sendPktQ.qsize() < 1:
event_is_set = listenEvent.wait(0)
packetDict = sendPktQ.get()
data = redisPub.publish('chnlName', packetToSend)
logging.info("packet size reached to ============================================ %s ------------ %s"%(len(packetToSend),data))
if __name__ == "__main__":
main()