문제

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")
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top