class StoppableServer(_baseclass): allow_reuse_address = True def __init__(self, addr, zpar_model_path, model_list, *args, **kwds): # store the hostname and port number self.myhost, self.myport = addr # store the link to the loaded zpar object self.z = ZPar(zpar_model_path) # initialize the parent class _baseclass.__init__(self, addr, *args, **kwds) # Call the individual loading functions # and only register the appropriate methods if 'tagger' in model_list: tagger = self.z.get_tagger() self.register_function(tagger.tag_sentence) self.register_function(tagger.tag_file) if 'parser' in model_list: parser = self.z.get_parser() self.register_function(parser.parse_sentence) self.register_function(parser.parse_file) self.register_function(parser.parse_tagged_sentence) self.register_function(parser.parse_tagged_file) if 'depparser' in model_list: parser = self.z.get_depparser() self.register_function(parser.dep_parse_sentence) self.register_function(parser.dep_parse_file) self.register_function(parser.dep_parse_tagged_sentence) self.register_function(parser.dep_parse_tagged_file) # register the function to remotely stop the server self.register_function(self.stop_server) self.quit = False def serve_forever(self): while not self.quit: try: self.handle_request() except KeyboardInterrupt: print("\nKeyboard interrupt received, exiting.") break self.z.close() self.server_close() def stop_server(self): self.quit = True return 0, "Server terminated on host %r, port %r" % (self.myhost, self.myport)