

지원 종료 알림: 2026년 5월 31일에에 대한 지원이 AWS 종료됩니다 AWS Panorama. 2026년 5월 31일 이후에는 AWS Panorama 콘솔 또는 AWS Panorama 리소스에 더 이상 액세스할 수 없습니다. 자세한 내용은 [AWS Panorama 지원 종료를 참조하세요](https://docs.aws.amazon.com/panorama/latest/dev/panorama-end-of-support.html).

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

# 여러 스레드 실행
<a name="applications-threading"></a>

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

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

**Example [packages/123456789012-DEBUG\$1SERVER-1.0/application.py](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/debug-server/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 서버를 실행하지만 스스로 종료할 수는 없습니다. 각 스레드는 자체 오류를 처리해야 합니다. 오류가 발견되어 로그되지 않으면 스레드가 자동으로 종료됩니다.

**Example [packages/123456789012-DEBUG\$1SERVER-1.0/application.py](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/debug-server/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` 속성을 설정합니다.

**Example [packages/123456789012-DEBUG\$1SERVER-1.0/application.py](https://github.com/awsdocs/aws-panorama-developer-guide/blob/main/sample-apps/debug-server/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)
```

