2014-06-15 7 views
3

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() 메서드를 안전하게 호출 할 수 있습니까?

답변

1

예, BaseServer.shutdown() 메서드는 스레드로부터 안전합니다.

serve_forever 메서드는 종료 플래그가 설정 될 때까지 사용되며 해당 플래그를 설정하는 작업은 shutdown()입니다. 이 메서드는 다음과 같이 기술합니다.

루프가 완료 될 때까지 차단됩니다. 이것은 serve_forever()가 다른 스레드에서 실행 중일 때 호출되어야합니다. 그렇지 않으면 교착 상태가됩니다.

GIL과 관련이 없습니다. 파이썬 프로세스가 C 확장 및 I/O 외부에서 효율적으로 사용할 수있는 코어의 수만을 제한합니다.

+0

감사합니다. 그런 다음 .shutdown()을 사용합니다. –