WebAssembly 用在了哪里?18个激动人心的 Wasm 初创公司

本文作者:Renee Shah,Amplify Partner

原文链接:https://reneeshah.medium.com/how-webassembly-gets-used-the-18-most-exciting-startups-building-with-wasm-939474e951db

本文的翻译与传播已获得原作者 Renee 的授权。

在这里插入图片描述

每当我聊起我对 WebAssembly(简称 “Wasm”)感兴趣时,大家常常问我 “WebAssembly 到底能用在哪里?” 。因此就有了这篇文章,我将讲解初创公司在生产中如何使用 WebAssembly 。和其它新兴技术一样,一项技术的早期,五成的精力会花在如何以及怎样使用方面的探索。 我希望这篇文章能让开发者更深入地了解人们日常是怎么使用 Wasm 的,并帮助大家更好地进行技术选择。

本文结构

本文假设你对 WebAssembly 已经有了一定的了解,但如果你需要入门指引,可以查看这篇文章。我和 18 家初创公司聊了聊,这些公司或在生产中使用了 WebAssembly,或在创建核心基础设施以开发 Wasm 应用程序。1 每家受访公司都回答了两个问题,答案就在问题后面。

  • 你是如何使用 Wasm 的?
  • 你为什么从所有的技术方案中选择了 Wasm?

我将这18家公司分成了以下几类:

  • 构建的产品中使用了 Wasm 技术的初创公司
    • 服务端
    • 客户端
  • 构建 Wasm 基础设施的初创公司
    • 服务端
    • 客户端

让我们开始吧。
脑图为译者总结

产品使用 Wasm 技术的初创公司

使用 Wasm – 服务端

Drifting in SpacePaul Butler,创始人

你们是如何使用 Wasm 的? 我们做的是 Jamsocket, 它允许开发者为每个用户即时部署服务器。 为了和现有镜像兼容,我们使用 OCI 容器作为部署单元,但我们有一个使用我们的开源 Stateroom 包部署 Wasm 服务器模块的工作流程。 我们正在尝试在不使用 Docker 的情况下直接用 Wasm ,这样可以缩短冷启动时间。

为什么选择 Wasm? 我们的核心功能取决于我们的服务器启动以响应用户操作,因此冷启动时间非常重要。 相对于 Docker,Wasm 提供了快速的冷启动时间,并开辟了有趣的可能性,例如在节点之间移动正在运行的模块,以在运行模块的资源需求发生变化时对其进行负载平衡。

Hash.aiDavid Wilkinson, CEO

你们是如何使用 Wasm 的? HASH 使用 Wasm 作为我们仿真引擎的通用字节码的关键层。 我们用 Rust 编写 hEngine 并包含一个 Wasm 编译目标,然后从我们的其他语言(包括 Python 和 JavaScript)调用 Wasm,以访问任何环境中的通用引擎处理。 通过将 Wasm 嵌入到我们的 Web 应用程序中,我们获取一个可以在客户端运行代码的高性能仿真引擎,并且可以轻松地确保跨多个代码编写平台的仿真行为一致。

为什么选择 Wasm? 在 HASH 诞生之初,Wasm 让我们选择了 Rust 作为我们的核心平台编程语言。Wasm 正在迭代成为一个更加可移植、可访问和高效的执行环境,这意味着我们能够相信 Rust 和 Wasm 会朝着我们需要的方向发展。 Rust 和 Wasm 也确实有着这些发展。 我们也很看好 Wasm 继续成长为可跨语言和平台访问的通用

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebAssembly(wasm)中,由于其底层是基于字节码的虚拟机,它本身并不支持多线程,但是可以通过JavaScript来实现多线程的功能。具体来说,可以通过Web Worker API来在WebAssembly中开启多个线程。 Web Worker是一种可以在后台运行的JavaScript线程,它可以与其他线程并行工作。通过Web Worker API,我们可以在WebAssembly中创建一个Worker线程,将计算任务分配给Worker线程,从而实现多线程计算。 具体步骤如下: 1. 在主线程中创建一个Worker对象,并将WebAssembly模块传递给Worker线程; 2. 在Worker线程中接收WebAssembly模块,并将其实例化为一个WebAssembly实例; 3. 在Worker线程中定义一个函数,用于接收主线程传递过来的数据,进行计算,并将计算结果返回给主线程; 4. 在主线程中调用Worker线程的postMessage方法,将计算任务传递给Worker线程; 5. 在主线程中定义一个函数,用于接收Worker线程返回的计算结果。 需要注意的是,由于WebAssembly与JavaScript之间的数据传输需要使用TypedArray对象,因此需要保证主线程和Worker线程之间的数据传输类型一致。 下面是一个简单的例子,演示了如何在WebAssembly中开启一个Worker线程: ```javascript // 在主线程中创建一个Worker对象 const worker = new Worker('worker.js'); // 在Worker线程中接收WebAssembly模块,并将其实例化为一个WebAssembly实例 worker.postMessage({ type: 'init', wasmModule: wasmModule }); // 在主线程中调用Worker线程的postMessage方法,将计算任务传递给Worker线程 worker.postMessage({ type: 'calculate', data: data }); // 在主线程中定义一个函数,用于接收Worker线程返回的计算结果 worker.onmessage = function(event) { if (event.data.type === 'result') { // 处理计算结果 } }; ``` 在Worker线程中,我们需要监听message事件,接收主线程传递过来的消息,并根据消息类型进行相应的处理。下面是一个简单的Worker线程示例: ```javascript // 在Worker线程中接收WebAssembly模块,并将其实例化为一个WebAssembly实例 let wasmInstance; onmessage = function(event) { if (event.data.type === 'init') { wasmInstance = new WebAssembly.Instance(event.data.wasmModule); } if (event.data.type === 'calculate') { const data = event.data.data; // 在Worker线程中定义一个函数,用于接收主线程传递过来的数据,进行计算,并将计算结果返回给主线程 const result = wasmInstance.exports.calculate(data); postMessage({ type: 'result', result: result }); } }; ``` 在上面的示例中,我们在Worker线程中定义了一个名为calculate的函数,用于接收主线程传递过来的数据,进行计算,并将计算结果返回给主线程。在实际应用中,需要根据具体的业务逻辑来定义Worker线程中的函数。 需要注意的是,由于WebAssembly目前仍然处于发展阶段,它的多线程支持也在不断改进中,因此在实际应用中需要仔细评估多线程的使用场景和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值