Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python和队列中的线程会导致内存泄漏或内存错误_Python_Multithreading_Memory Leaks_Queue - Fatal编程技术网

python和队列中的线程会导致内存泄漏或内存错误

python和队列中的线程会导致内存泄漏或内存错误,python,multithreading,memory-leaks,queue,Python,Multithreading,Memory Leaks,Queue,我已经在python中使用多线程和队列创建了简单的代码。我有一个主线程,它一直在队列中添加数据(队列maxsize为2000),将有5个不同的线程从队列中取出,并在某个特定通道发布到redis 代码运行得非常好,但在5或6小时后,发布机制会变慢。 当队列大小达到maxsize时,用于从队列中删除数据的线程速度变慢,并开始抛出缓冲区溢出错误。将数据添加到队列的速度与开始时相同 该问题在不同配置的Linux系统上发生的方式不同。如何识别它抛出的错误类型?如何调试这个问题 如前所述,代码非常简单,其中

我已经在python中使用多线程和队列创建了简单的代码。我有一个主线程,它一直在队列中添加数据(队列maxsize为2000),将有5个不同的线程从队列中取出,并在某个特定通道发布到redis

代码运行得非常好,但在5或6小时后,发布机制会变慢。 当队列大小达到maxsize时,用于从队列中删除数据的线程速度变慢,并开始抛出缓冲区溢出错误。将数据添加到队列的速度与开始时相同

该问题在不同配置的Linux系统上发生的方式不同。如何识别它抛出的错误类型?如何调试这个问题

如前所述,代码非常简单,其中主线程需要一个接一个地将数据添加到队列中,其他5个线程可以一个接一个地将数据从队列中取出

共享代码
导入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()