2011-12-29 69 views
17

我正在考虑在用户浏览我的网站时使用Web Workers来提供一些后台功能(这是Web Workers的用途,对吧?)。但是,我不想冒着通过导致滞后滚动,无响应的控制等来损害用户体验的风险.Web Worker被映射到操作系统线程,因此,我期望对这些线程的优先级进行一些控制,但是到目前为止据我所知,目前的API中没有这样的东西。你知道如何做到这一点?即使有黑客?有没有办法将Web Worker设置为低优先级?

+2

什么平台和语言? – rene 2012-01-01 17:41:03

+0

你打算使用网络工作者进行什么样的任务?定期活动?一次性执行任务? – Tudor 2012-01-01 18:31:20

+0

@Tudor我会说一次性执行(例如,用户上传一张照片,工作人员使用类似Photoshop的过滤器,这非常耗费CPU时间,然后工作人员会提醒主线程)。 – tunnuz 2012-01-02 07:46:06

回答

11

那么,没有API调用来控制像这样的低级细节。不过,我认为你应该首先实现你想要做的事情,然后测试一下用户体验中的性能影响是否太大。我假设由于他们没有对线程的执行方式进行良好控制,他们可能很好地被底层实现管理。

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是计算之间的时间,将需要不同取决于你在做什么,多长时间你能负担得起,以增加它的时间。这样做的一个好处是你可以在迭代之间接受暂停和取消请求。

相关问题