2011-12-29 22 views
17

Zastanawiam się, czy używać Web Workers, aby zapewnić funkcjonalność tła, podczas gdy użytkownik przegląda moją witrynę (do czego służą pracownicy WWW, prawda?). Nie chcę jednak ryzykować pogorszenia komfortu użytkownika, powodując opóźnione przewijanie, brak kontroli itp. Pracownicy sieci są mapowani na wątki systemu operacyjnego, stąd oczekiwałbym pewnej kontroli priorytetu tych wątków, jednak w miarę możliwości jak wiem, nie ma czegoś takiego w obecnym API. Czy wiesz, jak to osiągnąć? Nawet z hackowaniem?Czy istnieje sposób ustawienia Web Worker na niski priorytet?

+2

Na jakiej platformie i języku? – rene

+0

Do jakiego zadania zamierzasz korzystać z pracowników sieci? Okresowa aktywność? Jednorazowa realizacja zadania? – Tudor

+0

@Tudor Powiedziałbym, że jednorazowa egzekucja (np. Użytkownik przesyła zdjęcie, a pracownik stosuje do niego filtr podobny do Photoshopa, który jest dość intensywny dla procesora, następnie pracownik powiadamia główny wątek). – tunnuz

Odpowiedz

11

Cóż, nie ma żadnego połączenia API, aby kontrolować takie szczegóły na niskim poziomie. Jednak uważam, że najpierw należy zaimplementować to, co chcesz zrobić, a następnie przetestować, czy skuteczność działania jest zbyt duża w odniesieniu do wygody użytkownika. Zakładam, że skoro nie dodali precyzyjnej kontroli nad sposobem wykonywania wątków, prawdopodobnie są dobrze zarządzani przez podstawową implementację.

9

Nawet z hakiem? [...] użytkownik prześle fotografię i pracownika stosuje Photoshop jak filtr do niego, co jest bardzo obciąża CPU, wtedy pracownik alarmuje główny wątek

Oto hack.

Zwolnij swój kod. Coś w tym jest to, czego obecnie używam do symulacji cząstek:

var TIME_STEP = 10, 
    paused = false, 
    state; // set by commands.start() 

function main_loop() { 
    if (paused) { 
     return; 
    } 

    // update state incrementally. Break your process into chunks 
    // for example pixels or rows of pixels 
    state = ____________; 

    // send state or progress to main thread 
    if (finished) { 
     self.postMessage(state); 
    } else { 
     self.postMessage(progress); 
    } 

    setTimeout(main_loop, TIME_STEP); 
} 

var commands = { 
    //...functions that can be called from main thread (pause/start/cancel/etc)... 
}; 

function message_handler (event) { 
    var data = event.data; 
    var command = commands[data.command]; 

    command.apply(this, data.args); 
} 

self.addEventListener('message', message_handler, false); 

TIME_STEP jest czas pomiędzy obliczeń i będą musiały być różne w zależności od tego, co robisz i jak długo można sobie pozwolić na zwiększenie nadszedł czas. Jedną dobrą rzeczą w robieniu tego w ten sposób jest to, że możesz akceptować wstrzymywanie i anulować żądania między iteracjami.

Powiązane problemy