워커 만들기 및 관리

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

동시성 구현을 위해 워커를 사용하기 위한 첫 번째 단계는 백그라운드 워커를 만드는 것입니다. 두 가지 유형의 객체를 사용하여 워커를 만들 수 있습니다. 그중 하나는 Worker 인스턴스로서 이는 사용자가 직접 만듭니다. 다른 하나는 WorkerDomain 객체로서 이 객체에서는 Worker를 생성하고 응용 프로그램에서 실행 중인 Worker 객체를 관리합니다.

런타임은 로드된 후 자동으로 WorkerDomain 객체를 만듭니다. 또한 런타임에서는 응용 프로그램의 기본 swf에 대한 워커를 자동으로 만듭니다. 첫 번째 워커는 초기 워커 라고 합니다.

한 응용 프로그램에 대해 하나의 WorkerDomain 객체만 존재하므로 정적 WorkerDomain.current 속성을 사용하여 WorkerDomain 인스턴스에 액세스할 수 있습니다.

언제든 정적 Worker.current 속성을 사용하면 현재의 코드가 실행되고 있는 워커인 현재의 Worker 인스턴스에 액세스할 수 있습니다.

swf에서 Worker 객체 만들기

기본 swf가 초기 워커 안에서 실행되는 것처럼 백그라운드 워커는 단일 swf 파일의 코드를 실행합니다. 백그라운드 워커를 사용하려면 워커의 코드를 swf 파일로 작성 및 컴파일해야 합니다. 백그라운드 워커를 만들려면 부모 워커는 해당 swf 파일의 바이트를 ByteArray 객체로 액세스할 수 있어야 합니다. 이 ByteArray를 WorkerDomain 객체의 createWorker() 메서드에 전달하여 실제로 워커를 만듭니다.

백그라운드 워커 swf를 ByteArray 객체로 가져올 수 있는 세 가지 주요 방법은 다음과 같습니다.

워커 swf 포함

[Embed] 메타태그를 사용하여 워커 swf를 기본 swf 안에 ByteArray로 포함시킵니다.

[Embed(source="../swfs/BgWorker.swf", mimeType="application/octet-stream")] 
private static var BgWorker_ByteClass:Class; 
private function createWorker():void 
{ 
    var workerBytes:ByteArray = new BgWorker_ByteClass(); 
    var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); 
     
    // ... set up worker communication and start the worker 
}

워커 swf는 기본 swf 내에 BgWorker_ByteClass라는 이름의 ByteArray 하위 클래스로 컴파일됩니다. 이 클래스의 인스턴스를 만들면 워커 swf의 바이트로 미리 채워진 ByteArray가 제공됩니다.

외부 워커 swf 로드

URLLoader 객체를 사용하여 외부 swf 파일을 로드합니다. 이 swf 파일은 동일한 보안 도메인에서 가져와야 합니다. 예를 들면 기본 swf와 같은 인터넷 도메인에서 로드되거나 AIR 응용 프로그램 패키지에 포함되어 있는 swf 파일을 사용해야 합니다.

var workerLoader:URLLoader = new URLLoader(); 
workerLoader.dataFormat = URLLoaderDataFormat.BINARY; 
workerLoader.addEventListener(Event.COMPLETE, loadComplete); 
workerLoader.load(new URLRequest("BgWorker.swf")); 
 
private function loadComplete(event:Event):void 
{ 
    // create the background worker 
    var workerBytes:ByteArray = event.target.data as ByteArray; 
    var bgWorker:Worker = WorkerDomain.current.createWorker(workerBytes); 
     
    // ... set up worker communication and start the worker 
}

URLLoader에서 swf 파일의 로드를 마치면 URLLoader 객체의 data 속성(위의 예에서 event.target.data 참조)에서 해당 swf의 바이트를 사용할 수 있습니다.

기본 swf를 워커 swf로 사용하기

하나의 swf를 기본 swf 및 워커 swf로 모두 사용할 수 있습니다. 기본 표시 클래스의 loaderInfo.bytes 속성을 사용하여 swf의 바이트에 액세스합니다.

// The primordial worker's main class constructor 
public function PrimordialWorkerClass() 
{ 
    init(); 
} 
 
private function init():void 
{ 
    var swfBytes:ByteArray = this.loaderInfo.bytes; 
     
    // Check to see if this is the primordial worker or the background worker 
    if (Worker.current.isPrimordial) 
    { 
        // create a background worker 
        var bgWorker:Worker = WorkerDomain.current.createWorker(swfBytes); 
         
        // ... set up worker communication and start the worker 
    } 
    else // entry point for the background worker 
    { 
        // set up communication between workers using getSharedProperty() 
        // ... (not shown) 
         
        // start the background work 
    } 
}

이 기술을 사용할 경우 if 문을 활용하여 기본 클래스의 생성자 또는 이 생성자가 호출하는 메서드 안에서 swf 파일 코드를 분기하십시오. 해당 코드가 기본 워커 또는 백그라운드 워커 중 어디에서 실행되고 있는지 알려면 위의 예처럼 현재 Worker 객체의 isPrimordial 속성을 확인합니다.

워커 실행의 시작

워커를 만든 후에는 Worker 객체의 start() 메서드를 호출하여 코드 실행을 시작합니다. start() 작업은 즉시 발생하지 않습니다. 워커가 언제 실행되는지 알려면 Worker 객체의 workerState 이벤트에 대해 리스너를 등록하십시오. 이 이벤트는 Worker 객체가 코드 실행을 시작하는 경우처럼 수명 주기에서 상태를 전환할 때 전달됩니다. workerState 이벤트 핸들러에서 Worker 객체의 state 속성이 WorkerState.RUNNING 인지 확인하십시오. 이 지점에서 워커는 실행 중이며 기본 클래스의 생성자가 실행되었습니다. 다음 코드 목록에서는 workerState 이벤트에 대해 등록하고 start() 메서드를 호출하는 예를 보여 줍니다.

// listen for worker state changes to know when the worker is running 
bgWorker.addEventListener(Event.WORKER_STATE, workerStateHandler); 
// set up communication between workers using 
// setSharedProperty(), createMessageChannel(), etc. 
// ... (not shown) 
bgWorker.start(); 
private function workerStateHandler(event:Event):void 
{ 
    if (bgWorker.state == WorkerState.RUNNING) 
    { 
        // The worker is running. 
        // Send it a message or wait for a response. 
    } 
}

워커 실행 관리

WorkerDomain 클래스의 listWorkers() 메서드를 사용하면 언제든 응용 프로그램에서 실행 중인 워커 세트에 액세스할 수 있습니다. 이 메서드에서는 초기 워커를 포함해 state 속성이 WorkerState.RUNNING 인 워커 세트를 반환합니다. 시작되지 않았거나 실행이 이미 중지된 워커는 포함되지 않습니다.

워커가 더 이상 필요하지 않으면 Worker 객체의 terminate() 메서드를 호출하여 해당 워커를 종료하고 메모리와 기타 시스템 리소스를 해제할 수 있습니다.