小编典典

关于Web Worker中同步请求的意见

ajax

我想知道你对此有何看法。建议在Web Worker中使用同步请求(XMLHttpRequest)?我能找到什么问题?

我已经在我的应用程序中对此进行了测试,但没有发现任何麻烦。但是由于使用jQuery和AJAX的旧经验,我担心这种同步行为。我的应用程序从数据库中的多个表中获取大量数据,这需要时间。对于从表中检索到的每束数据,我需要立即对其进行处理,以免延迟整个过程。同时,用户正在与浏览器进行交互,因此可以将其阻止,我认为网络工作者可以正常工作。您认为这是一个很好的解决方案吗?还是应该尝试使用异步请求?

谢谢。


阅读 583

收藏
2020-07-26

共1个答案

小编典典

我没有确凿的事实,但是既然您要征求意见… :)

Chrome中存在一个明显的问题:太多的Web
Worker会导致无提示的崩溃(根据此bug报告,上限为60-100
)。普遍的问题是,至少在v8中,Web Workers占用大量资源。

假设最终要进行多个HTTP调用,如果要在Web Worker中进行同步HTTP调用:

  • 从某种意义上说,您是在用异步HTTP调用来交换异步Web Workers,这只会在混合中添加其他中介,而您仍然必须异步管理事物。
  • 如果您走的是更简单,更节省资源的路线,并且只使用一个Web Worker,您将花费大量时间等待它给您响应。
  • 另一方面,如果您使用多个Web Worker,则可能需要跟踪哪个空闲,忙碌等,在这种情况下,您将创建一个本地的调度程序,而不是使用自带的调度程序。嵌入浏览器。
  • 最后,Web Workers很昂贵(显然),您最终可能会创建多个Web Workers,以便他们可以坐下来等待HTTP调用完成。

我不认为自己是这方面的专家,所以请考虑它的价值。

更新:针对各种情况添加了一些优点/缺点。

在使用Web Worker进行同步和异步HTTP调用之间进行选择时,会想到一些优点/缺点:

  • 通常,同步请求将更易于编写,并将导致易于遵循的代码。同步请求的一个缺点是它们可能鼓励编写长函数,这些长函数应划分为单独的较小的函数。
  • 如果您要进行单个调用,则在两种方法之间完成时间所花费的时间没有差异,并且同步更好,因为它更简单一些。我说这只是简单一点,因为使用一个回调侦听器进行单个异步调用确实非常简单。
  • 如果您要进行多个按特定顺序进行的调用,例如加载用户的个人资料数据,然后根据其地址获取本地天气,则同步调用会更好,因为它更容易编写,也更容易读。读取它的主要内容是调用中的顺序依赖关系,将通过选择同步进行调用及其在函数中的顺序来明确概述。呼叫越多,这个问题就越重要。如果有许多呼叫,那么复杂性的差异可能会很大。
  • 如果您必须进行多个不需要按任何特定顺序进行的调用,那么异步请求会更好,因为与同步请求相比,整个过程可能要快几个数量级。您拨打的电话越多或连接速度越慢,总经过时间的差异就越大;这种差异将很快增长(成倍增长?)。从阅读代码的人的角度来看,我认为在这种情况下使用同步请求会 有些 具有误导性,因为这将暗示呼叫具有顺序性质,即使没有。从编写一系列彼此不依赖的异步请求的角度来看,应该不会太糟糕,因为您只需设置一个计数器,进行所有调用,在每个回调中增加计数器,然后完成当计数器等于您拨打的电话数时。

我发现与网络工作者一起工作的一件事是,他们似乎每个人都有自己的http限制。根据节流之前的浏览器,浏览器将并发http请求的数量限制为8或12个左右,如果您要处理大量请求,这可能会成为瓶颈。我发现,如果我通过我的请求网络工作者,每个人可以在开始节流之前执行8到12个并发请求。对于某些应用程序来说,这可能是一个巨大的好处。

2020-07-26