2013-02-09 3 views
0

저는 파이썬으로 작성된 서버에서 작업하고 있습니다. 클라이언트가 cmd를 보내면 서버는 실행 시간을 알 수없는 함수를 호출합니다. 따라서 블로킹을 피하기 위해 스레딩을 사용했습니다. 그러나 자식 프로세스를 살펴보면 종료되지 않아 많은 메모리 사용이 발생하는 것으로 보입니다. 편집 : http://pastebin.com/WZDxLquC 내가 정의 Thread 클래스 구현에 유래에서 발견 답변에 따라올바른 방법으로 스레드 사용

:

sThreads.py : 여기에

import threading 

class Thread(threading.Thread): 
    def __init__(self, aFun, args =()): 
    super(Thread, self).__init__(None, aFun, None, args) 
    self.stopped = threading.Event() 

    def stop(self): 
    self.stopped.set() 

    def isStopped(self): 
    return self.stopped.isSet() 

서버의 루프 다음 ​​디렉토리의 트리입니다 : mainServer.py에서

일부 :

def serve_forever(self, aCustomClass, aSize = 1024): 
    while True: 
     self.conn, self.addr = self.sock.accept() 
     msg = self.recvMSG(4096) 
     if(msg): 
     self.handShake(msg) 
     print 'Accepted !' 
     while True: 
      msg = self.recvMSG(aSize) 
      if(msg): 
      t = sThreads.Thread(self.handle, (aCustomClass,)) 
      t.start() 
      self.currentThreads.append(t) 

      if(self.workers > 0): 
       tt = sThreads.Thread(self.respond) 
       tt.start() 


      if(self.workers == 0 and len(self.currentThreads) > 0): 
       for th in self.currentThreads: 
       th.stop() 

커스텀 Thread 클래스를 사용해도 문제가 해결되지는 않지만 종료 된 쓰레드는 멈추지 않습니다!

편집 : 핸들()와() 대응 방법 추가 : 모든 문제를 일으키는) (

def handle(self, aClass): 
    self.workers += 1 
    self.queue.put(aClass._onRecieve(self.decodeStream())) 

    def respond(self): 
    while self.workers > 0: 
     msgToSend, wantToSend = self.queue.get() 
     self.workers -= 1 
     if(wantToSend): 
     print 'I want to send :', msgToSend 
     continue #Send is not yet implemented ! 
+1

'serve_forever()' 중첩 루프와 if 레벨은 7 단계로 구성됩니다. 실제로 어떻게해야할지 모르겠다. 그 안에있는 모든 코드가 실제로보고있는 문제와 관련이 있습니까? 실행중인 스레드가 실행되는 코드는 포함되지 않습니다. 쓰레드는'handle()'과'respond()'가 끝나면 자동으로 멈춰야한다. – millimoose

+1

또한, 모든 클라이언트 연결에 대해 * 여러 스레드를 시작하는 것처럼 보입니다. 재난에 대한 처방처럼 들리지만, 동시에 클라이언트 연결에서 읽고 쓰는 경우 어떻게 될까요? – millimoose

+0

위의 좋은 제안 외에도 다음과 같은 작은 부분이 있습니다.이 전체 부분을 'else'로 대체 할 수 있다고 생각합니다. if (self.workers == 0 and len (self.currentThreads)> 0) ' –

답변

0

그것은 그 self.queue.get 보인다을 ...

관련 문제