워커 및 동시성에 대한 이해

데스크톱 플랫폼용 Flash Player 11.4 이상, Adobe AIR 13.4 이상

응용 프로그램에서 워커를 사용하지 않는 경우, 응용 프로그램의 코드는 실행 스레드 라고 하는 단일 실행 단계 선형 블록에서 실행됩니다. 이 스레드에서는 개발자가 작성하는 코드를 실행합니다. 또한 이 스레드에서는 런타임에 속하는 많은 코드를 실행하며, 특히 표시 객체의 속성이 변경될 때 화면을 업데이트하는 코드를 주로 실행합니다. 코드는 메서드 및 클래스로서 일괄 작성되지만 런타임이 되면 마치 하나의 긴 일련의 단계로 작성된 것처럼 한 번에 한 행씩 실행됩니다. 다음은 응용 프로그램이 실행되는 단계를 보여 주는 가상의 예입니다.

  1. 프레임 진입: 런타임에서 enterFrame 이벤트 핸들러를 호출하여 해당 코드를 한 번에 하나씩 실행합니다.

  2. 마우스 이벤트: 사용자가 마우스를 움직이고 여러 rollover 및 rollout 이벤트가 발생할 때 런타임에서 마우스 이벤트 핸들러를 호출합니다.

  3. complete 이벤트 로드: url에서 xml 파일을 로드하는 요청으로 인해 로드된 파일 데이터가 반환됩니다. 이벤트 핸들러가 호출되어 해당 단계를 실행하면서 xml 데이터에서 xml 내용을 읽고 객체 세트를 만듭니다.

  4. 마우스 이벤트: 마우스가 다시 움직였으므로 런타임에서 관련 마우스 이벤트 핸들러를 호출합니다.

  5. 렌더링: 대기 중인 이벤트가 더 이상 없으므로 런타임에서 표시 객체의 변경 내용에 따라 화면을 업데이트합니다.

  6. 프레임 진입: 주기가 다시 시작됩니다.

위의 예에서 설명했듯이 가상의 단계 1~5는 프레임이라고 하는 단일 시간 블록 안에서 순서대로 실행됩니다. 전체 단계는 단일 스레드에서 순서대로 실행되므로 런타임에서는 프로세스 중 임의의 단계 하나를 실행하기 위해 다른 단계 하나를 중지할 수 없습니다. 초당 30프레임의 프레임 속도에서 런타임이 모든 작업을 실행하는 데 할당된 시간은 1/30초 미만입니다. 이는 대개 코드 실행에 충분한 시간이며 시간이 남아 런타임이 대기하는 것이 일반적입니다. 그러나 3단계에서 로드되는 xml 데이터가 용량이 매우 크며 깊이 중첩된 xml 구조로 된 경우도 있습니다. 이때, 코드가 xml에서 반복 실행되고 객체를 만들면서 모든 작업을 완료하려면 1/30초보다 더 긴 시간이 걸릴 수도 있습니다. 이 경우에는 마우스에 응답하고 화면을 다시 그리는 후반 단계는 정상 속도보다 더 느리게 실행됩니다. 이로 인해 화면은 마우스를 움직이는 사용자에 응답해서 충분한 속도로 다시 그려지지 않으므로 화면이 멈추는 현상이 발생할 수 있습니다.

모든 코드가 동일한 스레드에서 실행될 경우 이따금씩 발생하는 멈춤 현상을 피하는 방법은 단 한 가지입니다. 즉, 대용량 데이터 세트를 반복하는 것처럼 장시간 실행되는 작업을 수행하지 않는 것입니다. ActionScript 워커는 다른 해결책을 제공합니다. 별도의 워커에서 장시간 실행되는 코드를 실행할 수 있습니다. 각 워커는 개별 스레드에서 실행되므로 백그라운드 워커는 자체의 고유 스레드에서 장시간 실행되는 작업을 수행합니다. 따라서 기본 워커의 실행 드레드가 해제되어 화면이 다시 그려지면서 각 프레임은 다른 작업에 의해 차단되지 않습니다.

이러한 방식으로 다중 코드 작업을 동시에 실행하는 기능을 동시성 이라고 합니다. 백그라운드 워커가 작업을 종료하거나 작업 중 "진행" 지점에 위치한 경우 기본 워커 알림 및 데이터를 전송할 수 있습니다. 이와 같은 방식으로, 복잡하거나 오랜 시간이 걸리는 작업을 수행하는 코드를 작성하고 사용자 환경에서 화면 멈춤이 발생하는 문제를 방지할 수도 있습니다.

프레임 속도는 기본 렌더링 스레드가 다른 코드에 의해 차단될 때 감소할 수 있으며, 워커를 사용하면 이러한 문제를 최소화할 수 있습니다. 그러나 워커는 시스템 메모리 및 CPU를 추가로 점유하며 이는 곧 전반적인 응용 프로그램 성능의 저하로 이어질 수 있습니다. 각 워커에서는 자체의 런타임 가상 머신 인스턴스를 사용하므로 작은 워커도 큰 오버헤드를 일으킬 수 있습니다. 워커를 사용할 경우 모든 대상 플랫폼에서 해당 코드를 테스트하여 시스템에 추가되는 부담이 너무 크지 않은지 확인해야 합니다. 일반적인 상황에서 백그라운드 워커는 3개 이상 사용하지 않는 것이 좋습니다.