class SocketWorker(threadutil.Thread): """worker thread to process requests""" def __init__(self, server, callback): super(SocketWorker, self).__init__() self.setDaemon(True) self.server = server self.callback = callback if os.name == "java": # jython names every thread 'Thread', so we improve that a little self.setName("Thread-%d" % id(self)) def run(self): self.running = True try: log.debug("new worker %s", self.getName()) while self.running: # loop over all connections in the queue self.csock, self.caddr = self.server.workqueue.get() if self.csock is None and self.caddr is None: # this was a 'stop' sentinel self.running = False break log.debug("worker %s got a client connection %s", self.getName(), self.caddr) self.csock = SocketConnection(self.csock) if self.handleConnection(self.csock): self.server.threadpool.updateWorking( 1) # tell the pool we're working try: while self.running: # loop over all requests during a single connection try: self.callback.handleRequest(self.csock) except (socket.error, ConnectionClosedError): # client went away. log.debug("worker %s client disconnected %s", self.getName(), self.caddr) break self.csock.close() finally: # make sure we tell the pool that we are no longer working self.server.threadpool.updateWorking(-1) # Note: we don't swallow exceptions here anymore because @Pyro.callback doesn't # do anything anymore if we do (the re-raised exception would be swallowed...) #except Exception: # exc_type, exc_value, _ = sys.exc_info() # log.warn("swallow exception in worker %s: %s %s",self.getName(),exc_type,exc_value) finally: self.server.threadpool.remove(self) log.debug("stopping worker %s", self.getName()) def handleConnection(self, conn): try: if self.callback.handshake(conn): return True except (socket.error, PyroError): x = sys.exc_info()[1] log.warn("error during connect: %s", x) conn.close() return False
class SocketWorker(threadutil.Thread): """worker thread to process requests""" def __init__(self, server, callback): super(SocketWorker, self).__init__() self.setDaemon(True) self.server = server self.callback = callback def run(self): self.running = True try: log.debug("worker %s waiting for work", self.getName()) while self.running: # loop over all connections in the queue self.csock, self.caddr = self.server.workqueue.get() if self.csock is None and self.caddr is None: # this was a 'stop' sentinel self.running = False break log.debug("worker %s got a client connection %s", self.getName(), self.caddr) self.csock = SocketConnection(self.csock) if self.handleConnection(self.csock): while self.running: # loop over all requests during a single connection try: self.callback.handleRequest(self.csock) except (socket.error, ConnectionClosedError): # client went away. log.debug("worker %s client disconnected %s", self.getName(), self.caddr) break self.csock.close() finally: try: self.server.threadpool.remove(self) except KeyError: pass log.debug("worker %s stopping", self.getName()) def handleConnection(self, conn): try: if self.callback.handshake(conn): return True except (socket.error, PyroError), x: log.warn("error during connect: %s", x) conn.close() return False
class SocketWorker(threadutil.Thread): """worker thread to process requests""" def __init__(self, server, callback): super(SocketWorker,self).__init__() self.setDaemon(True) self.server=server self.callback=callback def run(self): self.running=True try: log.debug("worker %s waiting for work", self.getName()) while self.running: # loop over all connections in the queue self.csock,self.caddr = self.server.workqueue.get() if self.csock is None and self.caddr is None: # this was a 'stop' sentinel self.running=False break log.debug("worker %s got a client connection %s", self.getName(), self.caddr) self.csock=SocketConnection(self.csock) if self.handleConnection(self.csock): while self.running: # loop over all requests during a single connection try: self.callback.handleRequest(self.csock) except (socket.error,ConnectionClosedError): # client went away. log.debug("worker %s client disconnected %s", self.getName(), self.caddr) break self.csock.close() finally: try: self.server.threadpool.remove(self) except KeyError: pass log.debug("worker %s stopping", self.getName()) def handleConnection(self,conn): try: if self.callback.handshake(conn): return True except (socket.error, PyroError), x: log.warn("error during connect: %s",x) conn.close() return False