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

时间:2011-12-29 14:44:10

标签: javascript multithreading web-worker thread-priority

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

2 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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);

TIME_STEP是计算之间的时间,需要根据您的工作情况以及您可以花多长时间来增加时间。这样做的一个好处是你可以在迭代之间接受暂停和取消请求。