0

私は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 !
4

1 に答える 1

0

self.queue.get() がすべての問題を引き起こしているようです...

于 2013-02-10T17:31:15.017 に答える