Запуск SimpleXMLRPCServer в отдельном потоке и завершение работы - PullRequest
2 голосов
/ 02 февраля 2009

У меня есть класс, который я хочу проверить через SimpleXMLRPCServer в python. Мой модуль настроен так, что я создаю новый поток и запускаю в нем 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. И поскольку здесь, похоже, нет никаких механизмов прерывания или тайм-аута, которые я мог бы использовать, я не знаю, как правильно отключить поток сервера.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2015

У меня была та же проблема, и после нескольких часов исследований я решил ее, переключившись с использования моего собственного цикла handle_request () на serve_forever () , чтобы запустить сервер.

serve_forever () запускает внутренний цикл, подобный вашему. Этот цикл можно остановить, вызвав shutdown () . После остановки цикла можно остановить сервер с помощью 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")
1 голос
/ 02 февраля 2009

Два предложения.

Предложение Первое - использовать отдельный процесс вместо отдельного потока.

  • Создание автономной серверной программы XMLRPC.

  • Начните с subprocess.Popen().

  • Убейте его, когда тест закончен. В стандартных ОС (не Windows) уничтожение работает хорошо. В Windows, однако, нет тривиальной функции уничтожения, но есть рецепты для этого.

Другим предложением является наличие функции на вашем сервере XMLRPC, которая вызывает самоуничтожение сервера. Вы определяете функцию, которая вызывает sys.exit() или os.abort() или вызывает аналогичное исключение, которое остановит процесс.

...