Подтвердить что ты не робот

Есть ли способ установить для Web Worker низкий приоритет?

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

4b9b3361

Ответ 1

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

Ответ 2

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