我编写了一个ESL服务器,它控制FreeSWITCH服务器上的呼叫流程。问题是连接关闭后,内存消耗不会降低到正常。在与服务器建立了大约一百个连接后,它的内存消耗将达到GB,并且必须强行终止。我已经确定了ESLconnection对象的问题。我尝试使用del删除对象及其实例,但无济于事。代码如下:
ivrServer.py
import SocketServer
from ESL import *
import importlib
import sys
import threading
import traceback
import signal
import time
class ESLRequestHandler(SocketServer.BaseRequestHandler):
#svr_ivr_log = None
def setup(self):
fd = self.request.fileno()
self.con = ESLconnection(fd)
self.svr_ivr_log.info("Client connected: %s" % str(self.client_address))
def handle(self):
ivr_script = importlib.import_module('script')
ivr_script = reload(ivr_script)
ivr_script.process(self.con)
def finish(self):
self.con.disconnect()
ESLRequestHandler.svr_ivr_log = logging('server')
SocketServer.ThreadingTCPServer.allow_reuse_address = True
server = SocketServer.ThreadingTCPServer(('', 9090), ESLRequestHandler)
server.serve_forever()
script.py:
def process(con):
info = con.getInfo()
uuid = info.getHeader('unique-id')
con.execute('hangup', "NORMAL_CLEARING", uuid)
这将需要为您的linux版本编译的freeswitch的ESL模块。如果我需要解释这样做的程序,请告诉我。这里使用的是Python2.7。
答案 0 :(得分:0)
...为每个请求创建一个新实例。
每个请求都会创建一个新的ESLRequestHandler
实例。
在setup()
中,您建立了与FreeSWITCH服务器的连接,但在处理完请求后,您永远不会将其关闭。我怀疑这是内存泄漏的来源。
要关闭与FreeSWITCH服务器的连接,您可以执行以下操作:
class ESLRequestHandler(SocketServer.BaseRequestHandler):
#svr_ivr_log = None
def setup(self):
fd = self.request.fileno()
self.con = ESLconnection(fd)
self.svr_ivr_log.info("Client connected: %s" % str(self.client_address))
def handle(self):
pass # your code for interacting with the FreeSWITCH server here
def finish(self):
self.con.disconnect() # close the connection