0

메모리가 새 것처럼 보이는 파이썬 프로그램을 작성 중입니다.파이썬 - 쓰레드 프로그램에서 메모리 누수가있는 것 같습니까?

프로그램은 URL의 목록을 가져 와서 상태 코드가 200인지 확인합니다. 상태 코드가 200이 아닌 경우 스크립트는 이메일을 통해 나를 경고합니다. 스크립트가 스레드되어 URL이 서로 병렬로 검사 될 수 있습니다.

나는 매 5 분마다 실행되는 서버 스케줄 작업 중 하나에서 프로그램을 설정했습니다. 그 이후로 서버의 물리적 메모리가 완전히 소모되었습니다. 서버에서 Windows Server 2008 및 Python 버전 2.6을 실행 중입니다.

어디에서 메모리 누수가 발생합니까 ??

from ConfigParser import ConfigParser 
    import re 

    from UrlChecker import UrlCheckerThread 
    from Logger import Logger 
    from classes.EmailAlert import EmailAlert 

    ... {More Code is here} ... 

    urls = cfg.items('urls') 

    defaulttimeout = int(cfg.get('timeout', 'default', 0)) 

    threadList = [] 

    for name, url in urls: 
     m = re.search("\([0-9]*\)", name)   
     s = m.start() + 1 
     e = m.end() - 1 
     name = name[s:e] 

     checker = UrlCheckerThread(url, name) 
     threadList.append(checker) 
     checker.start() 

    for threads in threadList: 
     threads.join() 

    for x in threadList: 
     status = x.status 
     url = x.url 
     name = x.name 
     runtime = x.runtime 

     """ 
     If there is an error, put information in a dict for furher 
     processing. 
     """ 

     if(status != None and status != 200 or runtime >= defaulttimeout): 
      self.logDict[name]= (name, url, status, runtime) 

UrlChecker.py

import socket 
from threading import Thread, Lock 
from urllib2 import Request, urlopen 
from ConfigParser import ConfigParser 
from TimeoutController import TimeoutController 
from classes.StopWatch import StopWatch 

class UrlCheckerThread(Thread): 
lock = Lock() 
threadId = 0 

def __init__(self, url, name): 
    Thread.__init__(self) 
    self.url = url 
    self.name = name 
    self.cfg = ConfigParser() 
    self.cfg.read('c:\Websites\ServerManager\V100\webroot\Admin\SiteMonitor\config.cfg') 
    self.thisId = UrlCheckerThread.threadId 
    self.extendedTimeout = int(self.cfg.get('timeout', 'extended', 0)) 
    self.tc = TimeoutController() 
    self.tc.setTimeout(self.extendedTimeout) 
    UrlCheckerThread.threadId += 1 

def run(self): 
    """ 
    getHeader uses urlopen to check wether an website is online or not 
    """ 
    self.sw = StopWatch() 
    self.sw.start() 
    self.checker = UrlChecker() 
    UrlCheckerThread.lock.acquire() 
    self.status = self.checker.getStatus(self.url) 
    self.sw.stop() 
    self.runtime = self.sw.time() 
    """ 
    if(isinstance(self.status, socket.timeout)): 
     self.tc.setTimeout(self.extendedTimeout) 
     self.status = self.checker.getStatus(self.url) 
     if(self.status == 200): 
      self.status = 'short time out' 
     self.tc.setTimeout(self.defaultTimeout) 
    """ 
    UrlCheckerThread.lock.release() 

class UrlChecker: 

def getStatus(self, url): 
    """ 
    getHeader uses urlopen to check wether an website is online or not 
    """ 
    request = Request(url, None) 
    try: 
     urlReq = urlopen(request) 

     """ 
     getcode() return the HTTP status header, which should be 200 
     in most cases. 
     """ 
     return urlReq.getcode() 
    except IOError, e: 
     if hasattr(e, 'reason'): 
      """ 
      e.reason returns an IOError object, which cannot be just 
      inserted in the database. The IOError object is basically 
      a 2-Tuple with an errornumber and an errorstring. 
      Since an errornumber is less readable then a string, 
      we use e.reason.strerror to just return IOError's string 
      """ 
      return e.reason.strerror 
     elif hasattr(e, 'code'): 
      """ 
      e.code is an int object, which is perfectly fine to insert in 
      the database. So no further modification needed. 
      """ 
      return e.code 
당신을 감사합니다

다음 코드는 스레드 클래스 UrlChecker.py (또한 아래에 포함)를 호출!

답변

0

각 스레드마다 구성 파일을 열려고하는데 메모리가 필요합니다.
얼마나 많은을 확인 하시겠습니까?
ConfigParser 구현이란 무엇입니까?
각 스레드가 조인합니까?
배치 프로그램이 다음 예약 실행 전에 완료 되었습니까?

+0

각 스레드마다 구성 파일을 열려고하는데 메모리가 필요합니다. 귀하의 권리,하지만 그 메모리가 자동 가비지 수집에 의해 출시 되나요? 얼마나 많은을 확인 하시겠습니까? 현재 19 개의 URL을 확인 중입니다. ConfigParser 구현이란 무엇입니까? Im 파이썬의 내장 파서를 사용합니다. ConfigParser에서 가져 오기 ConfigParser 각 스레드가 조인합니까? 아니요 ... 프로세스가 완료된 후에 스레드를 종료해야합니까? 다음 예약 실행 전에 배치 프로그램이 완료 되었습니까? 예, Windows 스케줄 작업 프로그램이 한 번에 여러 개 실행되지 않도록 구성되었습니다. –

관련 문제