Есть ли способ установить веб-работник с низким приоритетом? - PullRequest
17 голосов
/ 29 декабря 2011

Я думаю об использовании веб-работников для обеспечения некоторой фоновой функциональности, пока пользователь просматривает мой веб-сайт (для этого и нужны веб-работники, верно?). Тем не менее, я не хочу рисковать пользовательским интерфейсом, вызывая медленную прокрутку, не отвечающие элементы управления и т. Д. Веб-работники отображаются на потоки ОС, поэтому я ожидаю некоторого контроля над приоритетом этих потоков, однако, поскольку как я знаю, в текущем API такого нет. Вы знаете, как это сделать? Даже со взломом?

Ответы [ 2 ]

11 голосов
/ 02 января 2012

Ну, нет API-вызова для управления низкоуровневыми деталями, подобными этому. Тем не менее, я думаю, что вы должны сначала реализовать то, что вы хотите сделать, а затем проверить, слишком ли сильно сказывается производительность пользователя. Я предполагаю, что, поскольку они не добавили точного контроля над выполнением потоков, вероятно, они хорошо управляются базовой реализацией.

9 голосов
/ 15 декабря 2012

Даже со взломом?[...] пользователь загружает фотографию, и рабочий применяет к ней фильтр, похожий на Photoshop, который сильно загружает процессор, затем рабочий предупреждает основной поток

Вот хак.

Замедли свой код.Примерно так я сейчас и использую для симуляции частиц:

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 - это время между вычислениями, и оно должно быть разным в зависимости от того, что вы делаете и как долго вы можете позволить себе увеличитьпора.Хорошая вещь в этом заключается в том, что вы можете принимать запросы на паузу и отмену между итерациями.

...