有没有办法将Web Worker设置为低优先级?

tun*_*nuz 17 javascript multithreading web-worker thread-priority

我正在考虑使用Web Workers在用户浏览我的网站时提供一些后台功能(这就是Web Workers的用途,对吧?).但是,我不想冒着通过导致延迟滚动,无响应控件等来破坏用户体验的风险.Web Worker被映射到OS线程上,因此我期望对这些线程的优先级进行一些控制,但是到目前为止据我所知,目前的API中没有这样的东西.你知道怎么做到这一点吗?即使有黑客攻击?

Tud*_*dor 11

好吧,没有API调用来控制像这样的低级细节.但是,我认为您应该首先实现您想要做的事情,然后测试性能是否对用户体验影响太大.我假设因为他们没有对线程的执行方式进行精细控制,所以它们可能很好地由底层实现管理.


Ann*_*nan 9

即使有黑客攻击?[...]用户上传照片并且工作人员对其应用类似Photoshop的过滤器,这是相当CPU密集型的,然后工作人员警告主线程

这是一个黑客.

减慢代码速度.这样的东西是我目前用于粒子模拟的东西:

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);
Run Code Online (Sandbox Code Playgroud)

TIME_STEP是计算之间的时间,需要根据您的工作情况以及您可以承受多长时间来增加时间.以这种方式执行此操作的一个好处是您可以在迭代之间接受暂停和取消请求.