별도의 스레드에서 Simplexmlrpcserver를 실행하고 종료합니다
-
20-08-2019 - |
문제
Python에서 Simplexmlrpcserver를 통해 테스트하고 싶은 수업이 있습니다. 단위 테스트를 설정하는 방식은 새 스레드를 만들고 SimpleXMLRPCServer를 시작하는 것입니다. 그런 다음 모든 테스트를 실행하고 마침내 종료되었습니다.
이것은 내 Serverthread입니다.
class ServerThread(Thread):
running = True
def run(self):
self.server = #Creates and starts SimpleXMLRPCServer
while (self.running):
self.server.handle_request()
def stop(self):
self.running = False
self.server.server_close()
문제는 ServerThread.Stop ()을 호출 한 다음 Thread.Stop () 및 Thread.join ()이 Handle_Request에서 요청을 기다리는 경우 스레드가 제대로 중지되지 않는다는 것입니다. 여기에 사용할 수있는 인터럽트 또는 타임 아웃 메커니즘이없는 것 같습니다. 서버 스레드를 깨끗하게 종료 할 수있는 방법에 대한 손실이 있습니다.
해결책
두 가지 제안.
제안은 별도의 스레드 대신 별도의 프로세스를 사용하는 것입니다.
독립형 XMLRPC 서버 프로그램을 만듭니다.
시작하십시오
subprocess.Popen()
.테스트가 완료되면 죽입니다. 표준 OS (Windows가 아님)에서 킬은 잘 작동합니다. 그러나 Windows에는 사소한 킬 기능이 없지만이를위한 레시피가 있습니다.
다른 제안은 XMLRPC 서버에서 서버 자체 파괴를 일으키는 기능을 갖는 것입니다. 호출하는 함수를 정의합니다 sys.exit()
또는 os.abort()
또는 프로세스를 중지하는 유사한 예외를 제기합니다.
다른 팁
나는 같은 문제가 있었고 몇 시간의 연구 후 내 자신의 사용에서 전환하여 해결했습니다. handle_request () 루프로 serv_forever () 서버를 시작합니다.
serv_forever () 당신과 같은 내부 루프를 시작합니다. 이 루프는 호출하여 중지 될 수 있습니다 일시 휴업(). 루프를 중지 한 후 서버를 server_close ().
나는 이것이 왜 작동하는지 모르겠다 handle_request () 루프는 그렇지 않지만; p
내 코드는 다음과 같습니다.
from threading import Thread
from xmlrpc.server import SimpleXMLRPCServer
from pyWebService.server.service.WebServiceRequestHandler import WebServiceRquestHandler
class WebServiceServer(Thread):
def __init__(self, ip, port):
super(WebServiceServer, self).__init__()
self.running = True
self.server = SimpleXMLRPCServer((ip, port),requestHandler=WebServiceRquestHandler)
self.server.register_introspection_functions()
def register_function(self, function):
self.server.register_function(function)
def run(self):
self.server.serve_forever()
def stop_server(self):
self.server.shutdown()
self.server.server_close()
print("starting server")
webService = WebServiceServer("localhost", 8010)
webService.start()
print("stopping server")
webService.stop_server()
webService.join()
print("server stopped")