goroutine 到底是什么?

2024-03-01

我读过的教程和文档都说 goroutine 是“不完全是线程”或“轻量级线程”,但通常可以将它们视为它们自己的单独线程。

那么...它们到底是什么?


Goroutine 与典型操作系统线程有一些区别:

  • There's 用户态调度。当一个 goroutine 被阻塞时(比如在网络上等待),Go 运行时会寻找另一个可以运行的 goroutine。这种情况的发生无需进入和退出内核模式,也无需运行操作系统内核的调度程序。
  • 没有only用户模式调度:为了使用多个核心,Go 将启动多个操作系统线程并在所有线程上运行 goroutine,可能会在操作系统线程之间移动 goroutine 以保持所有事务繁忙。如果您听说 goroutine 被“多路复用”到操作系统线程上,那就是这个意思。
  • 它们的启动成本应该很低。堆栈一开始很小,只有几千字节,然后根据需要不断增长,无论操作系统是否使用虚拟内存过量使用。
  • 它们与语言紧密相连;除了go声明本身有渠道类型 http://golang.org/ref/spec#Channel_types和运营和select声明 http://golang.org/ref/spec#Select_statements用于协调 goroutine。
  • They lack一些操作系统线程功能:目前,Go 的调度程序不能保证公平性,并且只有非常有限的抢占(一个空的)for{}循环永远不会被切换离开)。

它们与许多其他术语密切相关:

  • fibers https://en.wikipedia.org/wiki/Fiber_%28computer_science%29,与用户模式调度线程相关的术语
  • 绿线 https://en.wikipedia.org/wiki/Green_threads,用于指代用户模式调度线程的另一个术语
  • 协程 https://en.wikipedia.org/wiki/Coroutine,指的是可以在代码中任意点相互控制的例程
  • 事件驱动架构 https://en.wikipedia.org/wiki/Event-driven_architecture,它可能会在等待网络 I/O 等异步事件时切换到其他任务,但可能不会提供类似线程的接口(例如,它们可能会使用回调函数)
  • M:N 混合螺纹 https://en.wikipedia.org/wiki/Thread_(computing)#Models,它涉及内核模式线程和用户模式线程,并且可能涉及跨操作系统线程的用户模式线程迁移。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

goroutine 到底是什么? 的相关文章

  • 记录 http.ResponseWriter 内容

    Premise 我发现了类似的问题 但不适用于我的情况 因此请不要将其标记为重复 我在 Go 中有一个 HTTP 服务器 并且创建了一个中间件记录请求 响应时间 我也想记录响应 我用过httputil DumpRequest在一个名为的函数
  • 将 Websocket 消息发送到 Go 中的特定通道(使用 Gorilla)

    我对 Go 很陌生 并且发现自己使用套接字作为我的第一个项目 这是一个多余的问题 但我无法理解如何将 websocket 更新发送到 Go 中的特定通道 使用 Gorilla 我在用此链接中的代码示例 https github com go
  • 修改现有的yaml文件并添加新的数据和注释

    我最近看到了yaml https github com go yaml yaml tree v3lib 有新版本 V3 与nodes https github com go yaml yaml blob v3 yaml go L348功能
  • 无法从另一个标签的源代码构建和安装 go

    我正在尝试使用此从源代码构建和安装 go文档 https go dev doc install source 当我喜欢以下内容时 这效果很好 git clone https go googlesource com go goroot cd
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 无法将字符串解组为 int64 类型的 Go 值

    我有结构 type tySurvey struct Id int64 json id omitempty Name string json name omitempty I do json Marshal在 HTML 页面中写入 JSON
  • 如何获取文件的 ctime、atime、mtime 并更改它们

    如何使用 Go 获取文件的 ctime mtime atime 并更改它们 在 Go 1 1 2 中 os Stat只能获取mtime os Chtimes 可以更改 mtime 和 atime 但不能更改 ctime Linux ctim
  • Google App Engine Golang 没有这样的文件或目录

    我正在用 Go 开发一个 Google App Engine 项目 并陷入了读取文件的困境 事实上 应用程序在本地运行得很好 然而 部署时 它会恐慌告诉我没有这样的文件或目录 这是我的 fileValue 方法 func fileValue
  • runtime.LockOSThread 是否允许子 goroutine 在同一个操作系统线程中运行?

    我明白在 Go 中 runtime LockOSThread https golang org pkg runtime LockOSThread将一个 goroutine 绑定到一个操作系统线程 并且不允许其他 goroutine 在该线程
  • 当变量更新时动态刷新模板的一部分golang

    在Golang中 当变量更新时可以刷新模板的一部分吗 例如 我们可以在 Angular js 中找到这一点 基本上在我的代码中 我通过 ajax 中的邮政编码查找地址 它显示我找到的该邮政编码的用户列表 Here is a sample o
  • Golang Appengine 项目无法构建

    我有一个使用 golang 的应用程序引擎项目 我已经大约一年没有碰过了 我现在无法让它在之前构建的机器上构建 我收到以下错误 go app builder 解析输入失败 解析器 src golang org x net internal
  • 为什么我的 SQL 占位符没有被替换(使用 Go pq)?

    根据文档 我正在这样做 var thingname string asdf var id int err database QueryRow SELECT id from things where thing thingname Scan
  • 视频第一帧

    我正在创建一个单页应用程序 后端使用 Golang 前端使用 javascript 我想找到一种使用 Golang 获取视频第一帧的方法 首先 我将 mp4 视频文件上传到服务器 它保存在服务器上 有没有办法使用 Golang 获取该视频的
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 在 IntelliJ IDEA 中运行。多个文件和错误未定义:数据

    我想使用 IntelliJ IDE 社区版编写代码GO Go语言 我安装了正确的插件 并安装了构建应用程序所需的所有工具 我的应用程序包含以下两个文件 每个都在目录中 事件服务器 Main go Data go 如果我想使用 Run Ctl
  • 如何在C#中执行Go函数

    有没有办法从 C 执行 Go 函数 例如 对于 Python 我会使用 Ironpython 我知道我可以生成一个进程来执行 Go 脚本 但如果可能的话 我真的不想回退到这样的解决方案 Google 搜索没有显示任何内容 那么有什么方法可以
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 在处理程序之后访问 HTTP 请求上下文

    在我的日志记录中间件 链中的第一个 中 我需要访问一些在链下游的某些身份验证中间件中编写的上下文 并且仅在处理程序本身执行之后 旁注 需要首先调用日志记录中间件 因为我需要记录请求的持续时间 包括在中间件中花费的时间 此外 当权限不足时 身
  • 重新插入通道导致死锁

    我有稳定的入站 作业 流 将其输入到无缓冲通道中 我有一个for range循环来迭代项目并处理它们 如果处理该项目失败 我会将项目重新插入通道中 以便稍后重试 问题是当我将项目重新插入通道时 它陷入僵局 我明白为什么会发生这种情况 处理器
  • 如何在 Ubuntu 中将 Go 程序作为守护进程启动?

    在 Ubuntu 中将 Go 程序作为守护进程启动的正确方法是什么 然后我将使用 Monit 对其进行监控 我应该做这样的事情 go run myapp go 我应该考虑 Go 特有的事情吗 您应该为您的程序构建一个可执行文件 go bui

随机推荐

  • Visual Studio 2010 中的 Boost,IntelliSense 错误

    我想看看你能否给我指路 我碰巧编译并引用了 boost 库 以便将它们与 Visual Studio 2010 一起使用 在构建我的测试项目时 我收到这两个 IntelliSense 错误 1 IntelliSense error dire
  • C# asp.net 调用 javascript

    我在 asp content 中有一个 div
  • 在Matlab中过滤包含NaN的图像?

    我有一个二维数组 doubles 代表一些数据 它有一堆NaNs在里面 数据的等值线图如下所示 所有的空白都是NaNs 灰色菱形可供参考 填充轮廓显示我的数据的形状 当我用过滤数据时imfilt the NaNs大量地研究数据 所以我们最终
  • 可重用的内容视图 .NET MAUI

    简而言之 我有一个内容视图 例如
  • 关键字“FOR”附近的语法不正确

    我已经写了下面提到的查询 DECLARE cols AS NVARCHAR MAX query AS NVARCHAR MAX select cols STUFF SELECT distinct QUOTENAME Name from db
  • 在android studio中删除AVD后如何释放空间?

    我想在android studio的AVD管理器中删除AVD 在删除它之前 它需要 4 GB 的存储空间 当我删除它时 我不会获得任何可用存储空间 删除模拟器后如何恢复空间 删除位于此目录中的模拟器的临时文件临时文件夹C Users use
  • 修复了 5 个流体 DIV 旁边的 DIV

    我需要一个相当复杂的布局 我已经尝试了几个小时来解决这个问题 但仍然没有运气 我需要 5 个流体 DIV 旁边有一个固定 div 所有流体 DIV 都需要具有不同的百分比 但所有 6 个 DIV 组合 1 个固定 5 个流体 必须等于父 D
  • 需要帮助创建架构以将 CSV 加载到 BigQuery 中

    我正在尝试从 Google Cloud Storage 将一些 CSV 文件加载到 BigQuery 中 并努力解决架构生成问题 有一个自动生成选项 但记录很少 问题是 如果我选择让 BigQuery 生成架构 它会很好地猜测数据类型 但有
  • 如何在react-native中保留在后台杀死的android应用程序的状态

    当 Android 应用程序被发送到后台时 它可以保留其实例状态 以防由于内存不足而被杀死 请参阅活动 onSaveInstanceState https developer android com reference android ap
  • 使用 AngularJS 获取图像请求

    我将要在 AngularJS 控制器中以 HTML 形式呈现的图像的源字符串存储在 AngularJS 控制器中 但是在初始化 Angular 控制器之前它会生成 404 这是 HTML div img src imageSource di
  • 实体框架和继承:NotSupportedException

    我越来越 System NotSupportedException 全部 实体集中的对象 Entities Message 必须具有唯一性 主键 然而 一个实例 输入 Model Message 和一个实例 Model Comment 类型
  • JQGrid - 我们如何制作自定义行详细信息

    有人给了我一些示例代码来使我的网格像这样 我在文档中读到 jqgrid 仅支持子网格 喜欢层次结构中的此页面http trirand net demoaspnetmvc aspx http trirand net demoaspnetmvc
  • 测试 getJSONArray 是否为 null

    我的代码提取 JSONObject 的结果 但是 有时 i 值不从 1 开始 并且出现如下错误 org json JSONException No value for 1 我的代码 JSONObject obj new JSONObject
  • 在哪里可以获取更多 Android 权限列表? (以外 ...)

    我正在尝试获取有效的 Android 权限列表 我知道 官方 的http developer android com reference android Manifest permission html http developer and
  • Eclipse 在哪里存储有关哪些文件是“派生”的信息?

    当您更改 Eclipse 项目的类路径时 classpath文件发生更改 因此如果您将项目发送给其他人 包括 classpath文件 它们具有相同的类路径 但是 当您将资源更改为 派生 时 两者都没有变化 project or classp
  • 如果数据库为空,则处理 ActiveRecord 错误

    我正在开发 Rails 4 应用程序 并且我有以下控制器代码 def index issue Issue find 1 sections issue sections articles issue articles end 如果数据库为空并
  • 我应该使用什么图来表示模块中功能之间的交互?

    我需要使用 UML 或 SysML 符号创建图表 我有由函数组成的模块 有些函数仅在模块 内部 使用 其他函数则由其他模块使用 Example MODULE 1有两个功能 func1 and func2 func2 uses func1 i
  • 删除javascript中下拉框的所有选项

    如何在javascript中动态删除下拉框的所有选项 document getElementById id options length 0 or document getElementById id innerHTML
  • React.js 从节点后端下载pdf文件

    我的代码只下载后端中存在的文件 我可以看到后端的 pdf 已正确创建并位于正确的位置 但是当我将文件发送并下载到前端并打开它时 无论我使用哪种浏览器 都会收到错误 无法加载 pdf 文档 我认为这一定意味着我的 blob 下载代码有问题 因
  • goroutine 到底是什么?

    我读过的教程和文档都说 goroutine 是 不完全是线程 或 轻量级线程 但通常可以将它们视为它们自己的单独线程 那么 它们到底是什么 Goroutine 与典型操作系统线程有一些区别 There s 用户态调度 当一个 gorouti