C/C++ HTTP/HTTPS 클라이언트 용 테스트 하네스를 함께 사용하고 있으며 테스트 하니스에있는 서버에 Python을 사용하고 싶습니다. 파이썬은 TCP/HTTP 서버와 핸들러 클래스를 매우 잘 사용하고있는 것으로 보이며,이 문제를 해결하기위한 최소한의 저항이되는 것처럼 보입니다.파이썬 TCPServer 또는 HTTPServer 또는 SimpleHTTPServer를 종료하는 방법은 무엇입니까?
즉, TCPServer
개체를 정상적으로 종료하는 방법을 알아 내려고합니다. 내 테스트 장치는 C++로 작성되었으며 서버를 호출하는 데 을 사용하고 싶습니다. 이는 단지 system()
으로 문제가되지 않으며 모든 대상 플랫폼 (Windows, OSX, Linux)에서 사용할 수 있기 때문입니다. 내가 파이썬 서버를 시작하기 위해 popen()
을 사용한다고 가정하면 파이썬 프로세스의 PID를 사용할 수 없으므로 서버를 쉽게 사용할 수 없습니다. SIGTERM
서버.
서버 프로세스의 STDIN에 'q'문자를 보내거나 정상적으로 종료되도록 EOF를 보내는 서버에 STDIN 파이프를 닫고 싶습니다. 나는 이것을하는 정말 좋은 방법을 알 수 없다.
TCPServer
/HTTPServer
등은 .serve_forever()
메서드를 호출 할 때 작업을 시작합니다. 그래서 TCPServer
이 .serve_forever()
이라는 메서드를 호출 할 때 영원히 서비스를 중단하는 것이 어렵다는 사실에 놀라지 말아야합니다.
def run_while_true(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
"""
This assumes that keep_running() is a function of no arguments which
is tested initially and after each request. If its return value
is true, the server continues.
"""
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
while keep_running():
httpd.handle_request()
을하지만 그것은 매우 잘 작동하지 않습니다의 중 -이 수신을 계속 실행할지 여부를 확인하는 요청을 마무리 서버에 의존 - 경우 : 다른 방법으로, BaseHTTPServer
에 대한 파이썬 문서를 반복하는 대신 .handle_request()
를 호출 제안 서버가 요청을받지 못하면 .handle_request()
에서 반환되지 않습니다.
TCPServer
이 방법은 .shutdown()
을 불렀다 않습니다
BaseServer.shutdown()
Tell the serve_forever() loop to stop and wait until it does.
New in version 2.6.
이 스레드 안전합니까? 나는 GIL에 대해 알고 있지만, 여전히 이것이 고려되는지 여부를 알고 싶습니다. Py38과 같은 Python 구현에 비추어을 수행하는 것이 옳은 것 같습니다. 다른 스레드에서 STDIN을 기다렸다가 STDIN에서 EOF를 얻을 때 TCPServer
의 .shutdown()
메서드를 안전하게 호출 할 수 있습니까?
감사합니다. 그런 다음 .shutdown()을 사용합니다. –