сокет-сервер не выключается при вызове server.shutdown () Python 3.7 Nosetests - PullRequest
0 голосов
/ 22 марта 2019

У нас есть unittest, который настроен следующим образом.

class ServerWrapper(object):
    """
    A test helper which manages an instance of a RPC server.
    Can be used as a context manager, or using start() and stop() methods.
    """

    def __init__(self, port, service):
        self._service = service
        self.address = ('localhost', port)

        self._server = None
        self._server_thread = None
        self._running = False

    def start(self):
        self._server = RPCServer(self._service, self.address)

        self._server_thread = Thread(target=self._server.serve_forever, args=(0.05,))
        self._server_thread.setDaemon(True)
        self._server_thread.start()

        self._running = True
        return self

    def stop(self):
        if not self._running:
            return

        self._server.shutdown()
        self._server_thread.join()

        # hacks to force the server to properly shutdown;
        # without this you get a socket already in use error
        self._server.server_close()
        del self._server

        self._running = False

    def __enter__(self):
        return self.start()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.stop()


class RPCEndToEndTestCase(unittest.TestCase):
    """
    End-to-end tests on RPC servers and proxies, confirming behaviour and performance is as
    expected.
    """

    def setUp(self):
        # start the sever
        self._server = ServerWrapper(65432, TestService(i=10)).start()
        # a short poll interval makes timeouts happen faster, and allows for faster running
        # consumer threads (when they rely on timeouts)
        self._proxy = RPCProxy([self._server.address], poll_interval=0.1, timeout=1)
        # type TestService

    def tearDown(self):
        # shutdown server
        self._server.stop()

    @staticmethod
    def _report(message):
        sys.stdout.write("\nE2E report: {}\n".format(message))

    def test_basic(self):
        self.assertEqual(11, self._proxy.inc())

При вызове модульного теста он отлично работает с python 2.7, но под python 3.7 он не проходит метод разрыва.

При расследовании мы увидели, что он продолжает зависать на методе server_close.wait ().

У кого-нибудь есть какие-нибудь советы?

Мы уже пытались установить

ThreadingMixIn.daemon_threads = True

, но безуспешно.

...