草庐IT

javascript - 关于 web worker 同步请求的看法

coder 2024-05-07 原文

我想知道您对此有何看法。是否推荐在 web worker 中使用同步请求(XMLHttpRequest)?我能发现什么问题?

我一直在我的应用程序中对此进行测试,但没有发现任何问题。但我害怕这种同步行为,因为以前使用 jQuery 和 AJAX 的经验。 我的应用程序从数据库中的多个表中获取大量数据,这需要时间。对于从表中检索到的每一组数据,我需要立即对其进行处理,以免拖延整个过程。同时,用户正在与浏览器交互,所以它可以被阻止,我认为 web workers 可以正常工作。 您认为这是一个好的解决方案吗?或者我应该尝试使用异步请求吗?

谢谢。

最佳答案

我没有确凿的事实,但既然你征求了意见......:)

Chrome 中有一个明显的问题:过多的 Web Worker 会导致静默崩溃(根据 this bug report ,上限为 ~60-100)。普遍的问题是 Web Worker 是资源密集型的,至少对于 v8 是这样。

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

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

我不认为自己是这方面的专家,所以请物有所值。

更新:为各种场景添加一些优点/缺点。

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

  • 一般来说,同步请求会更容易编写,并且会产生易于理解的代码。同步请求的一个缺点是它们可能会鼓励编写长函数,而这些函数应该分割成单独的、更小的函数。
  • 如果您进行单个调用,则两种方法完成所需的时间没有区别,同步更好,因为它更简单一些。我说它只是简单了一点,因为使用一个回调监听器的单个异步调用确实非常简单。
  • 如果您要进行必须按特定顺序发生的多个调用,例如加载用户的个人资料数据,然后根据他们的地址获取本地天气,同步调用会更好,因为它更容易编写并且更容易阅读。阅读它的主要内容是调用中的顺序依赖关系将通过选择同步进行调用及其在函数中的顺序来清楚地概述。电话越多,这就越重要。如果有很多调用,复杂性的差异可能会很大。
  • 如果您必须进行不需要按任何特定顺序发生的多次调用,那么异步请求会更好,因为整个过程可能比同步请求快几个数量级。您调用的电话越多或连接速度越慢,总耗用时间的差异就越大;这种差异会增长得非常快(呈指数增长?)。从阅读代码的人的 Angular 来看,我认为在这种情况下使用同步请求会有点误导,因为它会暗示调用具有顺序性,即使实际上没有。从编写一系列相互不依赖的异步请求的 Angular 来看,这应该不会太糟糕,因为您只需设置一个计数器,进行所有调用,在每个回调中递增计数器,您就完成了当计数器等于您调用的电话数时。

更新:@rbrundritt非常有趣且相关 observation in a comment关于这个答案:

One thing I found working with web workers is that they appear to each gain their own http limit. Browsers limit the number of concurrent http requests to around 8 or 12 depending on the browser before throttling, which can be a bottle neck if you have a lot of requests to process. I've found that if I pass my requests web workers, each can do 8 to 12 concurrent requests before they start throttling. This can be a huge benefit for some apps.

@rbrundritt

关于javascript - 关于 web worker 同步请求的看法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14068084/

有关javascript - 关于 web worker 同步请求的看法的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  5. ruby - HTTP 请求中的用户代理,Ruby - 2

    我是Ruby的新手。我试过查看在线文档,但没有找到任何有效的方法。我想在以下HTTP请求botget_response()和get()中包含一个用户代理。有人可以指出我正确的方向吗?#PreliminarycheckthatProggitisupcheck=Net::HTTP.get_response(URI.parse(proggit_url))ifcheck.code!="200"puts"ErrorcontactingProggit"returnend#Attempttogetthejsonresponse=Net::HTTP.get(URI.parse(proggit_url)

  6. ruby-on-rails - 关于 Ruby 的一般问题 - 2

    我在我的rails应用程序中安装了来自github.com的acts_as_versioned插件,但有一段代码我不完全理解,我希望有人能帮我解决这个问题class_eval我知道block内的方法(或任何它是什么)被定义为类内的实例方法,但我在插件的任何地方都找不到定义为常量的CLASS_METHODS,而且我也不确定是什么here,并且有问题的代码从lib/acts_as_versioned.rb的第199行开始。如果有人愿意告诉我这里的内幕,我将不胜感激。谢谢-C 最佳答案 这是一个异端。http://en.wikipedia

  7. ruby-on-rails - 获取并发布相同匹配项的请求 - 2

    在我的路线文件中我有:match'graphs/(:id(/:action))'=>'graphs#(:action)'如果是GET请求(工作)或POST请求(不工作),我想匹配它我知道我可以使用以下方法在资源中声明POST请求:post'/'=>:show,:on=>:member但是我怎样才能为比赛做到这一点呢?谢谢。 最佳答案 如果你同时想要POST和GETmatch'graphs/(:id(/:action))'=>'graphs#(:action)',:via=>[:get,:post]编辑默认值可以设置如下match'g

  8. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

  9. ruby - 在 Mechanize 中使用 JavaScript 单击链接 - 2

    我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan

  10. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

随机推荐