여러 스레드 실행 - AWS Panorama

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

여러 스레드 실행

처리 스레드에서 애플리케이션 로직을 실행하고 다른 백그라운드 프로세스에는 다른 스레드를 사용할 수 있습니다. 예를 들어 디버깅을 위해 HTTP 트래픽을 제공하는 스레드나 추론 결과를 모니터링하고 데이터를 AWS로 전송하는 스레드를 만들 수 있습니다.

여러 개의 스레드를 실행하려면 Python 표준 라이브러리의 스레딩 모듈을 사용하여 각 프로세스에 대한 스레드를 만듭니다. 다음 예시는 애플리케이션 개체를 만들고 이를 사용하여 세 개의 스레드를 실행하는 디버그 서버 샘플 애플리케이션의 메인 루프를 보여줍니다.

packages/123456789012-DEBUG_SERVER-1.0/application.py – 메인 루프
def main(): panorama = panoramasdk.node() while True: try: # Instantiate application logger.info('INITIALIZING APPLICATION') app = Application(panorama) # Create threads for stream processing, debugger, and client app.run_thread = threading.Thread(target=app.run_cv) app.server_thread = threading.Thread(target=app.run_debugger) app.client_thread = threading.Thread(target=app.run_client) # Start threads logger.info('RUNNING APPLICATION') app.run_thread.start() logger.info('RUNNING SERVER') app.server_thread.start() logger.info('RUNNING CLIENT') app.client_thread.start() # Wait for threads to exit app.run_thread.join() app.server_thread.join() app.client_thread.join() logger.info('RESTARTING APPLICATION') except: logger.exception('Exception during processing loop.')

모든 스레드가 종료되면 애플리케이션이 자동으로 다시 시작됩니다. run_cv 루프는 카메라 스트림의 이미지를 처리합니다. 중지 신호를 받으면 디버거 프로세스를 종료합니다. 디버거 프로세스는 HTTP 서버를 실행하지만 스스로 종료할 수는 없습니다. 각 스레드는 자체 오류를 처리해야 합니다. 오류가 발견되어 로그되지 않으면 스레드가 자동으로 종료됩니다.

packages/123456789012-DEBUG_SERVER-1.0/application.py – 처리 루프
# Processing loop def run_cv(self): """Run computer vision workflow in a loop.""" logger.info("PROCESSING STREAMS") while not self.terminate: try: self.process_streams() # turn off debug logging after 15 loops if logger.getEffectiveLevel() == logging.DEBUG and self.frame_num == 15: logger.setLevel(logging.INFO) except: logger.exception('Exception on processing thread.') # Stop signal received logger.info("SHUTTING DOWN SERVER") self.server.shutdown() self.server.server_close() logger.info("EXITING RUN THREAD")

스레드는 애플리케이션의 self 개체를 통해 통신합니다. 디버거 스레드는 애플리케이션 처리 루프를 다시 시작하기 위해 stop 메서드를 호출합니다. 이 메서드는 다른 스레드에 종료 신호를 보내는 terminate 속성을 설정합니다.

packages/123456789012-DEBUG_SERVER-1.0/application.py – 중지 메서드
# Interrupt processing loop def stop(self): """Signal application to stop processing.""" logger.info("STOPPING APPLICATION") # Signal processes to stop self.terminate = True # HTTP debug server def run_debugger(self): """Process debug commands from local network.""" class ServerHandler(SimpleHTTPRequestHandler): # Store reference to application application = self # Get status def do_GET(self): """Process GET requests.""" logger.info('Get request to {}'.format(self.path)) if self.path == "/status": self.send_200('OK') else: self.send_error(400) # Restart application def do_POST(self): """Process POST requests.""" logger.info('Post request to {}'.format(self.path)) if self.path == '/restart': self.send_200('OK') ServerHandler.application.stop() else: self.send_error(400)