# 怎么运行的
尽管Cloudflare Workers在浏览器或Node.js中的行为类似于JavaScript,但在代码思考方式方面还是存在一些细微的差异。在后台,Workers运行时使用[V8引擎](https://v8.dev/)\-Chromium和Node.js使用相同的引擎。Workers运行时还实现了大多数现代浏览器中可用的许多标准[API](https://developers.cloudflare.com/workers/reference/runtime/apis)。
为浏览器或Node.js编写的JavaScript之间的差异发生在运行时。Workers功能不是在个人计算机(例如浏览器应用程序或中央服务器)上运行,而是在[Cloudflare的边缘网络](https://www.cloudflare.com/network/)上运行[\-Cloudflare的边缘网络](https://www.cloudflare.com/network/)是一个不断发展的全球性网络,分布在数百个位置的数千台计算机组成。

这些计算机中的每一个都承载一个Workers运行时的实例,并且每个运行时都能够运行成千上万个用户定义的应用程序。本指南将介绍其中的一些差异,并帮助您更深入地研究这些差异。
我们将从三个最大的差异开始:隔离度,每个请求计算和分布式执行。
## 隔离物
V8协调隔离:轻量级上下文,将变量与允许其变异的代码分组在一起。您甚至可以考虑将隔离运行为功能的“沙盒”。
一个运行时可以运行成百上千个隔离,在它们之间无缝切换。每个隔离区的内存都是完全隔离的,因此在运行时,每个代码段都可以免受其他不受信任或用户编写的代码的影响。隔离也可以快速启动。无需为每个功能创建虚拟机,而是在现有环境中创建隔离。该模型消除了虚拟机模型的冷启动。

与其他使用容器化进程的无服务器提供程序不同,每个提供程序都运行语言运行时的实例,Workers在边缘容器启动时就一次支付JavaScript运行时的开销。通过为每个Workers函数调用创建隔离,Workers进程能够运行几乎没有单独开销的实质上无限的脚本。任何给定的隔离都可以比容器或虚拟机上的Node进程快约一百倍地启动。值得注意的是,启动时隔离株消耗的内存少一个数量级。
给定的隔离群具有其自身的范围,但是隔离群不一定是长期存在的。隔离物可能会被旋转并驱逐,原因有以下几种:
* 机器上的资源限制
* 可疑脚本-任何被视为试图突破隔离沙箱的脚本
* 个别[资源限制](https://developers.cloudflare.com/workers/about/limits)
因此,通常建议您不要在全局范围内存储可变状态,除非您已考虑了这种偶然性。
如果您对我们如何使用Workers运行时处理安全性感兴趣,可以[阅读有关隔离与安全性和幽灵威胁缓解的关系的更多信息](https://developers.cloudflare.com/workers/about/security)。
## 按请求计算
大多数工作程序脚本是默认工作程序流的变体:
~~~javascript
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
/**
* Fetch and log a request
* @param {Request} request
*/
async function handleRequest(request) {
return new Response('Hello worker!', { status: 200 })
}
~~~
当Cloudflare的任何运行时收到对worker.dev子域或Cloudflare管理的域的请求时,Workers脚本都会将[`FetchEvent`](https://developers.cloudflare.com/workers/reference/apis/fetch-event)参数传递给脚本中定义的事件处理程序。在该处,您可以[`Response`](https://developers.cloudflare.com/workers/reference/apis/response)通过现场计算响应,使用[`fetch`](https://developers.cloudflare.com/workers/reference/apis/fetch)等等调用另一台服务器来生成一个。到达`respondWith`调用点所花费的CPU周期都对计算时间有所贡献。例如,`setInterval`超时不会在等待时消耗CPU周期。
**您的帐户根据脚本处理的请求数计费,而不是根据计算时间计费。**
### 进一步阅读
* [有关FetchEvents的更多信息](https://developers.cloudflare.com/workers/reference/apis/fetch-event)
* [有关请求上下文的更多信息](https://developers.cloudflare.com/workers/about/tips/request-context)
* [有关运行时限制的更多信息](https://developers.cloudflare.com/workers/about/limits)
## 分布式执行
隔离是有弹性的,并且在请求期间可以连续使用,但是在极少数情况下,可能会将隔离逐出。当脚本达到我们的[极限时,](https://developers.cloudflare.com/workers/about/limits)或者当运行请求的计算机上的资源异常紧张时,在正确解决事件*后*,运行时将有选择地逐出隔离。
与所有其他JavaScript平台一样,单个Workers实例可以处理多个请求,包括在单线程事件循环中的并发请求。不能保证任何两个请求都将落在同一实例中。因此,*不建议在事件处理程序中设置或更改全局状态*。您可以通过阅读[有关处理状态的更多信息](https://developers.cloudflare.com/workers/reference/storage/overview)来了解更多[信息](https://developers.cloudflare.com/workers/reference/storage/overview)。
- 关于本翻译文档
- 快速开始
- 模版库
- 讲解
- Workers页面
- 从0开始
- 从已有页面开始
- 从已有Worder开始
- 工具
- Cli工具 wrangler
- 安装
- 指令
- 配置
- 环境
- Webpack
- 密钥
- KV
- 网站
- Playground
- ServerLess插件
- Terraform
- REST API
- Making Requests
- Scripts
- Bindings
- Routes
- Integrations
- 相关
- 工作原理
- 安全
- 使用缓存
- 价格
- Routes
- Limits
- 提示
- 调试技巧
- 调试header
- FetchEvent生命周期
- 请求上下文
- 请求sign
- 参考
- runtime API
- Web Standards
- fetch
- fetchEvent
- Response
- Request
- KV
- Environment Variables
- Streams
- Encoding
- Web Crypto
- Cache API
- HTMLRewriter
- Workers KV
- Use cases
- Namespaces