私はPythonで書かれたサーバーに取り組んでいます。クライアントが cmd を送信すると、サーバーは実行時間が不明な関数を呼び出します。ブロッキングを避けるために、スレッドを使用しました。しかし、子プロセスを見ると、それらが終了していないように見え、多くのメモリ使用量が発生しています。編集: ここにディレクトリのツリーがあります: http://pastebin.com/WZDxLquC
stackoverflow で見つけた回答に従って、カスタム 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 クラスを使用しても問題は解決せず、終了したスレッドも停止しません!
編集: handle() および Respond() メソッドを追加しました:
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 !