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 !
'serve_forever()' 중첩 루프와 if 레벨은 7 단계로 구성됩니다. 실제로 어떻게해야할지 모르겠다. 그 안에있는 모든 코드가 실제로보고있는 문제와 관련이 있습니까? 실행중인 스레드가 실행되는 코드는 포함되지 않습니다. 쓰레드는'handle()'과'respond()'가 끝나면 자동으로 멈춰야한다. – millimoose
또한, 모든 클라이언트 연결에 대해 * 여러 스레드를 시작하는 것처럼 보입니다. 재난에 대한 처방처럼 들리지만, 동시에 클라이언트 연결에서 읽고 쓰는 경우 어떻게 될까요? – millimoose
위의 좋은 제안 외에도 다음과 같은 작은 부분이 있습니다.이 전체 부분을 'else'로 대체 할 수 있다고 생각합니다. if (self.workers == 0 and len (self.currentThreads)> 0) ' –