我正在考虑使用Web Workers在用户浏览我的网站时提供一些后台功能(这就是Web Workers的用途,对吧?)。但是,我不想冒着通过导致延迟滚动,无响应控件等来破坏用户体验的风险.Web Worker被映射到OS线程上,因此我希望对这些线程的优先级进行一些控制,但是到目前为止据我所知,目前的API中没有这样的东西。你知道怎么做到这一点吗?即使有黑客攻击?
答案 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
是计算之间的时间,需要根据您的工作情况以及您可以花多长时间来增加时间。这样做的一个好处是你可以在迭代之间接受暂停和取消请求。