Omówienie procesów roboczych i współbieżności

Flash Player 11.4 i nowsze wersje, Adobe AIR 13.4 i nowsze wersje dla komputerów

Jeśli w aplikacji nie są używane procesy robocze, kod aplikacji jest wykonywany w ramach jednego, liniowego bloku kroków wykonywania kodu określanego jako wątek wykonawczy. W wątku jest wykonywany kod napisany przez programistę. Dodatkowo wykonywana jest w nim również większość kodu będącego częścią środowiska wykonawczego. Jest to na przykład kod odpowiadający za zmiany zawartości ekranu po modyfikacji właściwości obiektów ekranowych. Chociaż kod jest pisany we fragmentach określanych jako metody i klasy, jego wykonywanie jest realizowane liniowo — tak, jakby był on jednym długim ciągiem poleceń. Poniżej znajduje się przykład kroków wykonywanych przez aplikację:

  1. Wejście do klatki: Środowisko wykonawcze wywołuje wszystkie moduły obsługi zdarzeń enterFrame i wykonuje po kolei ich kod.

  2. Zdarzenie myszy: Użytkownik przesuwa mysz. Środowisko wykonawcze wywołuje moduły obsługi zdarzeń związane z przesuwaniem kursora nad różnymi elementami i są realizowane zdarzenia przesuwania.

  3. Zdarzenie zakończenia wczytywania: Żądanie wczytania pliku XML z adresu URL zwraca dane wczytanego pliku. Wywołany moduł obsługi zdarzeń zwraca zawartość pliku XML i na podstawie tych danych tworzy zestaw obiektów.

  4. Zdarzenie myszy: Mysz zostaje ponownie przesunięta. Środowisko wykonawcze wywołuje odpowiednie moduły obsługi zdarzeń myszy.

  5. Renderowanie: Brak dalszych zdarzeń oznacza, że środowisko wykonawcze przechodzi do aktualizacji zawartości ekranu na podstawie zmian wprowadzonych w obiektach ekranowych.

  6. Wejście do klatki: Rozpoczyna się nowa realizacja cyklu.

W powyższym przykładzie hipotetyczne kroki 1–5 są wykonywane sekwencyjnie w jednym bloku czasu o nazwie „klatka”. Są one wykonywane sekwencyjnie w ramach jednego wątku, dlatego środowisko wykonawcze nie może przerwać jednego kroku procesu, aby wykonać inny. W przypadku animacji o szybkości 30 kl./s środowisko wykonawcze ma mniej niż 1/30 s na wykonanie wszystkich przedstawionych operacji. Często wystarcza to na uruchomienie odpowiedniego fragmentu kodu. Przez pozostały czas środowisko czeka na następną klatkę. Załóżmy jednak, że dane XML wczytywane w kroku 3 są bardzo obszerne i mają wielokrotnie zagnieżdżoną strukturę. Wykonanie kodu odczytującego w pętli dane XML i tworzącego odpowiednie obiekty może w takiej sytuacji zająć dużo więcej niż 1/30 s. Wówczas dalsze kroki (reakcja na ruch myszy i ponowne rysowanie ekranu) nie zostaną wykonane tak szybko, jak powinny. W takiej sytuacji dojdzie do przerw w wyświetlaniu obrazu spowodowanych zbyt późnym ponownym rysowaniem obrazu zmienionego po tym, gdy użytkownik ruszył mysz.

Jeśli cały kod jest wykonywany w jednym wątku, istnieje tylko jeden sposób na wyeliminowanie takich problemów. Jest nim unikanie czasochłonnych operacji, takich jak analizowanie dużych zestawów danych w pętlach. Procesy robocze języka ActionScript oferują inne rozwiązanie. Za ich pomocą czasochłonny kod może zostać wykonany w oddzielnym procesie roboczym. Każdy proces roboczy jest wykonywany w oddzielnym wątku. Oznacza to, że czasochłonną operację może realizować działający w tle — we własnym wątku — proces roboczy. Dzięki temu w głównym wątku wykonawczym można przejść do rysowania nowej klatki bez oczekiwania na realizację innych zadań.

Możliwość jednoczesnego, równoległego wykonywania różnych fragmentów kodu określana jest jako współbieżność . Gdy proces roboczy działający w tle zakończy pracę, jest możliwe wysłanie powiadomienia oraz danych do głównego procesu roboczego. Można to także wykonać w określonych punktach postępu. W ten sposób można utworzyć kod wykonujący złożone lub czasochłonne operacje, unikając utrudniania pracy użytkownikowi przez blokowanie ekranu.

Przydatność procesów roboczych polega na możliwości redukcji prawdopodobieństwa pominięcia klatek animacji spowodowanego blokowaniem głównego wątku renderującego przez inny kod. Jednak procesy robocze wymagają większej ilości pamięci systemowej i zwiększają obciążenie procesora, co może mieć negatywny wpływ na ogólną wydajność aplikacji. Każdy proces roboczy używa własnego wystąpienia maszyny wirtualnej środowiska wykonawczego, dlatego nawet niewielki obiekt może wprowadzać duży narzut związany z dodatkowymi operacjami. Wprowadzając do kodu procesy robocze, należy go przetestować na wszystkich platformach docelowych i upewnić się, że obciążenie systemu nie jest za duże. Firma Adobe zaleca, aby w typowych sytuacjach nie używać więcej niż dwóch procesów roboczych działających w tle.