gpt4 book ai didi

c# - JavaScript 中的 `WebWorkers` 概念是否类似于异步函数?

转载 作者:行者123 更新时间:2023-11-30 12:46:51 24 4
gpt4 key购买 nike

首先我在 C# 中开发了很多东西,现在我正在开发 3D Web 项目,现在最可用的语言是 JavaScript。

在 C# 中,直到出现新关键字 async/await在新的 C# 规范中,有一种方法可以使用以下方法进行异步调用:

  • 代表
  • Begin/End 函数,例如:BeginInvoke、EndInvoke
  • IAsync接口(interface)

  • 至于 JS ......现在我需要使用一些并行计算并且真的需要一个东西,这类似于使用 Semaphore、Mutex 或其他一些锁定模型的异步工作。

    至于 async/await... 我已经尝试过 promises 的概念,它是在 jQuery 中实现的,带有延迟的 promise:
  • http://api.jquery.com/deferred.promise/
  • http://api.jquery.com/category/deferred-object/

  • 它仍然是 C# 中的 async/await 概念:

    http://msdn.microsoft.com/en-us/library/hh191443.aspx

    但我也发现了 WebWorkers 这样的概念。 :

    https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

    当我第一次阅读它时,我认为它也可能是除了 promise 模式之外的解决方案,但如果从实现的 Angular 来看,我理解 WebWorkers 是从其他线程而不是主页面执行线程启动的,并且这些函数并不是真正异步的,它们只是带有一个选项的回调,它们已被添加到 Worker()例如,可以在主页面线程中使用,对吗?

    所以...我想知道,我怎样才能实现类似于 Semaphore 的东西在 JavaScript 中?

    谢谢!

    更新 #1 (更多回复 Doge):

    让我给你描述一个简单的例子,我正在开发一个应用程序。
    我已经将 jQuery 延迟对象用于一件事 to await all the texture images I've received, which I was awaiting for .

    链接是下一个: http://bit.ly/O2dZmQ

    这是一个 webgl申请 three.js库,它是在真实数据上 build 房屋(ps:不要看代码,我知道这不好:) 我最近才了解 js 编程的原型(prototype)方式 :) 首先我太习惯于 C# 及其范例) .

    所以……我有这样的任务。我必须等待从 AJAX 加载所有纹理,然后才将它们设置为网格的纹理。

    现在......当我创建这个问题时,我考虑过重新开发源代码并考虑使用 WebWorkers。

    在 C# 中开发 WPF/Silverlight 应用程序时,我首先想到了什么,我想做什么以及我做了什么。

    我已经完成了 的另一个实例 worker ,它将异步检查我上面描述的任务。

    我做了一个非常小而简单的例子,我想使用它,但是失败了。

    正如我所见 网络 worker 如果我想将对象发送给 worker ,请不要接受它。好的...

    Passing objects to a web worker

    有一个 JSON.stringify()方法...但是我看到了另一件事... JSON.stringify() 无法将对象解析为 circular references 的字符串.

    Chrome sendrequest error: TypeError: Converting circular structure to JSON

    真的...这很令人失望...因为如果有 C# 甚至 C++ 它是 不是 在实例之间交换一些对象的问题......有些事情可以通过一些重新解释强制转换或其他东西来完成......即使在异步工作中,即使在不同线程之间交换对象也不是问题......

    所以......为了我的目标......最好的解决方案是什么?保持延迟/ promise 模式,不要使用 网络 worker ?

    微小的来源,不是完整的应用程序,但只是一个小例子,我想做的事情:
  • http://pastebin.com/5ernFNme (JS需要HTML,如下)
  • http://pastebin.com/ELcw7SuE (JS主逻辑)
  • http://pastebin.com/PuHrhW8n (WebWorker,我想将其用作单独的检查器)

  • 小样本的纹理:
  • http://s14.postimg.org/wqm0xb2ep/box.jpg
  • http://s27.postimg.org/nc77umytv/box2.jpg

  • 可以在这里找到缩小的three.js:
  • https://github.com/mrdoob/three.js/blob/master/build/three.min.js
  • 最佳答案

    了解 JavaScript 很重要。没有线程 .它有一个事件循环,在事件进入时一个接一个地执行它们。

    这样做的结果是,如果您有一个需要一段时间的进程,那么您将阻止所有执行。如果还需要 JavaScript 来完成 UI 工作,例如响应用户事件或动画,那就有点麻烦了。您可以尝试将您的流程拆分为多个事件,以保持事件循环顺利运行,但这并不总是容易做到的。

    这是Workers来吧。 worker 们自己跑线程 .为了避免与线程相关的问题,工作人员不共享内存。

    您可以通过发送和接收消息与工作人员进行通信。消息依次进入事件循环,因此您不需要信号量或任何同步线程的东西。如果您的工作 Controller 使用 JavaScript,则永远不会有任何原子性问题。

    如果你的 worker 很简单input->output那么你完全可以在上面添加一个 Promise 层。请记住,Promises 本身不会添加线程或异步。

    只能发送Workers消息,即:字符串。您不能向它们发送对象,当然也不能发送可能引用其他对象的对象,因为再次:内存问题。

    如果我查看您的用例,我猜您可能想要 Workers 的唯一原因是利用当今大多数 CPU 拥有的多个内核。

    我认为您正在做的是将图像作为纹理加载到 Canvas 中,这会占用大量时间吗?这里没有使用 Worker 的好方法,因为 Worker 需要对 Canvas 的引用,而这并没有发生。

    现在,如果您需要对纹理进行处理以某种方式转换它们,您可以使用 Workers。将图像数据作为二进制字符串(可能是 base64_encoded)发送,进行转换并将其发回。如果您的图像很大,则序列化也会占用相当多的 CPU 时间,因此您的里程可能会有所不同。

    据我所知,您的资源加载速度非常快,而且似乎没有 CPU 瓶颈。所以我不知道你是否真的需要 worker 。

    关于c# - JavaScript 中的 `WebWorkers` 概念是否类似于异步函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22254630/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com