응용 프로그램에서 워커를 사용하지 않는 경우, 응용 프로그램의 코드는 실행
스레드
라고 하는 단일 실행 단계 선형 블록에서 실행됩니다. 이 스레드에서는 개발자가 작성하는 코드를 실행합니다. 또한 이 스레드에서는 런타임에 속하는 많은 코드를 실행하며, 특히 표시 객체의 속성이 변경될 때 화면을 업데이트하는 코드를 주로 실행합니다. 코드는 메서드 및 클래스로서 일괄 작성되지만 런타임이 되면 마치 하나의 긴 일련의 단계로 작성된 것처럼 한 번에 한 행씩 실행됩니다. 다음은 응용 프로그램이 실행되는 단계를 보여 주는 가상의 예입니다.
-
프레임 진입: 런타임에서
enterFrame
이벤트 핸들러를 호출하여 해당 코드를 한 번에 하나씩 실행합니다.
-
마우스 이벤트: 사용자가 마우스를 움직이고 여러 rollover 및 rollout 이벤트가 발생할 때 런타임에서 마우스 이벤트 핸들러를 호출합니다.
-
complete 이벤트 로드: url에서 xml 파일을 로드하는 요청으로 인해 로드된 파일 데이터가 반환됩니다. 이벤트 핸들러가 호출되어 해당 단계를 실행하면서 xml 데이터에서 xml 내용을 읽고 객체 세트를 만듭니다.
-
마우스 이벤트: 마우스가 다시 움직였으므로 런타임에서 관련 마우스 이벤트 핸들러를 호출합니다.
-
렌더링: 대기 중인 이벤트가 더 이상 없으므로 런타임에서 표시 객체의 변경 내용에 따라 화면을 업데이트합니다.
-
프레임 진입: 주기가 다시 시작됩니다.
위의 예에서 설명했듯이 가상의 단계 1~5는 프레임이라고 하는 단일 시간 블록 안에서 순서대로 실행됩니다. 전체 단계는 단일 스레드에서 순서대로 실행되므로 런타임에서는 프로세스 중 임의의 단계 하나를 실행하기 위해 다른 단계 하나를 중지할 수 없습니다. 초당 30프레임의 프레임 속도에서 런타임이 모든 작업을 실행하는 데 할당된 시간은 1/30초 미만입니다. 이는 대개 코드 실행에 충분한 시간이며 시간이 남아 런타임이 대기하는 것이 일반적입니다. 그러나 3단계에서 로드되는 xml 데이터가 용량이 매우 크며 깊이 중첩된 xml 구조로 된 경우도 있습니다. 이때, 코드가 xml에서 반복 실행되고 객체를 만들면서 모든 작업을 완료하려면 1/30초보다 더 긴 시간이 걸릴 수도 있습니다. 이 경우에는 마우스에 응답하고 화면을 다시 그리는 후반 단계는 정상 속도보다 더 느리게 실행됩니다. 이로 인해 화면은 마우스를 움직이는 사용자에 응답해서 충분한 속도로 다시 그려지지 않으므로 화면이 멈추는 현상이 발생할 수 있습니다.
모든 코드가 동일한 스레드에서 실행될 경우 이따금씩 발생하는 멈춤 현상을 피하는 방법은 단 한 가지입니다. 즉, 대용량 데이터 세트를 반복하는 것처럼 장시간 실행되는 작업을 수행하지 않는 것입니다. ActionScript 워커는 다른 해결책을 제공합니다. 별도의 워커에서 장시간 실행되는 코드를 실행할 수 있습니다. 각 워커는 개별 스레드에서 실행되므로 백그라운드 워커는 자체의 고유 스레드에서 장시간 실행되는 작업을 수행합니다. 따라서 기본 워커의 실행 드레드가 해제되어 화면이 다시 그려지면서 각 프레임은 다른 작업에 의해 차단되지 않습니다.
이러한 방식으로 다중 코드 작업을 동시에 실행하는 기능을
동시성
이라고 합니다. 백그라운드 워커가 작업을 종료하거나 작업 중 "진행" 지점에 위치한 경우 기본 워커 알림 및 데이터를 전송할 수 있습니다. 이와 같은 방식으로, 복잡하거나 오랜 시간이 걸리는 작업을 수행하는 코드를 작성하고 사용자 환경에서 화면 멈춤이 발생하는 문제를 방지할 수도 있습니다.
프레임 속도는 기본 렌더링 스레드가 다른 코드에 의해 차단될 때 감소할 수 있으며, 워커를 사용하면 이러한 문제를 최소화할 수 있습니다. 그러나 워커는 시스템 메모리 및 CPU를 추가로 점유하며 이는 곧 전반적인 응용 프로그램 성능의 저하로 이어질 수 있습니다. 각 워커에서는 자체의 런타임 가상 머신 인스턴스를 사용하므로 작은 워커도 큰 오버헤드를 일으킬 수 있습니다. 워커를 사용할 경우 모든 대상 플랫폼에서 해당 코드를 테스트하여 시스템에 추가되는 부담이 너무 크지 않은지 확인해야 합니다. 일반적인 상황에서 백그라운드 워커는 3개 이상 사용하지 않는 것이 좋습니다.