我想知道你对此有何看法。建议在Web worker中使用同步请求(XMLHttpRequest)?我能找到什么问题?
我一直在我的应用中测试这个,我没有发现任何问题。但是由于jQuery和AJAX的旧体验,我害怕这种同步行为。 我的应用程序从数据库中的几个表中获取大量数据,这需要一些时间。对于从表中检索到的每一组数据,我需要立即处理它,以免过多地延迟整个过程。同时,用户正在与浏览器进行交互,因此可以阻止它,我认为网络工作者可以正常工作。 你认为这是一个很好的解决方案吗?或者我应该尝试使用asynchronus请求吗?
谢谢。
答案 0 :(得分:18)
我没有确凿的事实,但是因为你要求提出意见...... :)
Chrome中存在一个明显的问题:太多的Web Workers可能导致无声崩溃(根据this bug report,大约60-100封)。一般的问题是Web Workers是资源密集型的,至少对于v8。
假设您最终要进行多个HTTP调用,如果您正在Web Worker中进行同步HTTP调用:
我不认为自己是这方面的专家,所以请把它当作它的价值。
更新:为各种方案添加一些优点/缺点。
在使用Web Worker时,在选择进行同步和异步HTTP调用时会想到一些优点/缺点:
更新:@rbrundritt在这个答案中提出了一个非常有趣且相关的observation in a comment:
我发现与网络工作者合作的一件事是他们看起来每个人都获得了自己的http限制。浏览器将并发http请求的数量限制在8或12左右,具体取决于限制前的浏览器,如果您有大量处理请求,这可能会成为瓶颈。我发现,如果我通过我的请求Web工作者,每个人可以在开始限制之前执行8到12个并发请求。对于某些应用来说,这可能是一个巨大的好处。
答案 1 :(得分:0)
我只是想添加一条注释(对于评论来说太长了),@ tiffon的答案中提到的〜60个网络工作者的限制似乎在Chromium中不再存在。我可以像这样在Chrome中创建500个工作程序,而不会出现错误/崩溃:
let workers = [];
for(let i = 0; i < 500; i++) {
let worker = new Worker(URL.createObjectURL(new Blob([`console.log('cool${i}')`])));
worker.postMessage({});
workers.push(worker);
}
await new Promise(r => setTimeout(r, 15000));
for(let i = 0; i < workers.length; i++) {
workers[i].terminate();
}
尽管如此,鉴于核心人数目前不超过64位,很难想象会有数百名工人适合这种情况。