首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏宇宙之_一粟

    Goroutine

    在下面的例子中,我们不是从一个函数建立一个goroutine,而是从一个匿名函数创建一个goroutine: go func() { fmt.Println("hello") }()// 1 // 本章接下来的部分会深入介绍goroutine及它是如何工作的。如果你只想编写一些可以在goroutine中正确运行的代码,那么可以考虑直接跳到下一章。 Goroutine没有定义自己的暂停或再入点; Go的运行时观察着goroutine的行为,并在阻塞时自动挂起它们,然后在它们变畅通时恢复它们。 在某种程度上,这使得它们可以抢占,但只是在goroutine被阻止的地方。它是运行时和goroutine逻辑之间的一种优雅合作关系。 因此,goroutine可以被认为是一种特殊的协程。 当我们拥有比绿色线程更多的goroutine时,调度程序处理可用线程间goroutines的分布,并确保当这些goroutine被阻塞时,可以运行其他goroutines。

    51241发布于 2020-10-26
  • 来自专栏TomatoCool

    goroutine

    使用go关键字可以为一个函数创建goroutine,相当于其它编程语言的多协程操作。 启动goroutine 可以发现go func中的程序并不影响后面的代码执行,但main函数执行完毕后goroutine也会被关闭,无论剩下的代码是否执行完毕。 time.Sleep(time.Second) fmt.Println("2") }() fmt.Println("1") // 添加等待时间,防止goroutine

    16430编辑于 2023-09-13
  • 来自专栏golang分享

    goroutine

    和thread有什么区别占用内存Go语言中的goroutine就是这样一种机制,goroutine的概念类似于线程,但 goroutine是由Go的运行时(runtime)调度和管理的。 () // goroutine结束就登记-1 fmt.Println("Hello Goroutine!" 这是因为10个goroutine是并发执行的,而goroutine的调度是随机的。 1.G很好理解,就是个goroutine的,里面除了存放本goroutine信息外 还有与所在P的绑定等信息。 2.P管理着一组goroutine队列,P里面会存储当前goroutine运行的上下文环境(函数指针,堆栈地址及地址边界),P会对自己管理的goroutine队列做一些调度(比如把占用CPU时间较长的goroutine

    4.6K10编辑于 2023-11-30
  • 来自专栏kwai

    Goroutine基础

    我们将讨论关于性能方面的一些知识,并通过创建一些简单的 goroutine 来扩展我们的应用程序。 我们还会关注一些 Go 语言的底层执行逻辑以及 Go 语言与其他语言的不同之处。 我们可以将应用程序“拆解”成多个并发任务,这些任务可以由不同的 goroutine 完成,通过这种方式即可实现了 Go 语言并发。

    52351编辑于 2023-03-09
  • 来自专栏一行舟

    Go Goroutine

    Hi,我是行舟,今天和大家一起学习Go语言的GoroutineGoroutine又叫Go语言的协程。Goroutine是Go语言用来实现并发的直接方法。 因为:我们启动一个Goroutine之后,Goroutine会立刻执行。同时我们的代码也会继续往后执行不会等待Goroutine返回。 Goroutine泄漏 虽然Goroutine使用起来非常简便,但我们在使用时还是要谨慎以免造成Goroutine泄漏。 如果我们创建了一个Goroutine,但是意外导致这个Goroutine永远不会退出,那么为此Goroutine分配的内存就永远不会释放,我们称这种情况为Goroutine泄漏。 要防止Goroutine泄漏我们在创建一个Goroutine时必须要考虑它何时退出。

    57620编辑于 2022-08-25
  • 来自专栏存储内核技术交流

    Goroutine分析方法

    背景 在日常开发项目中开了很多goroutine,每个gorouine执行不同的任务,有部分是高并发的业务针对延迟非常敏感,每个协程的资源分配情况以及每个协程调度情况,当前整个进程的runtime情况 rw-rw-r-- 1 perrynzhou perrynzhou 225 May 6 08:57 trace.go [perrynzhou@ubuntu-dev ~/schedule]$ 分析goroutine

    38630编辑于 2022-08-17
  • 如何控制 goroutine 以及让 goroutine 随时停止?

    如何控制 goroutine 以及让它随时停止呢?这两个问题在实际项目中非常常见,尤其是在需要高效且可控的并发程序时。场景:为什么需要控制和停止 goroutine? 控制和停止 goroutine 主要出现在以下几种场景:避免资源浪费:在并发程序中,goroutine 如果没有合理的控制,会导致资源浪费,尤其是在并发任务完成之后,如果 goroutine 还继续占用资源 协同工作:有时候我们需要多个 goroutine 协同工作,而在某些情况下,需要优雅地停止某些 goroutine,避免它们继续执行一些无意义的任务,或者等待所有 goroutine 完成。 如何控制和停止 goroutine? 使用 Channel 控制 goroutine基本原理Channel 是 Go 中用于 goroutine 间通信的核心工具。

    26920编辑于 2025-09-10
  • 来自专栏Golang语言社区

    无辜的goroutine

    简介: 本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go语言中goroutine的使用》提出了goroutine的几宗罪。 实际上goroutine确实有增加程序复杂度而容易导致问题之处,特别是死锁;但是另外的一些指控,我认为实际上goroutine是没有直接责任的。 以下就《论go语言中goroutine的使用》的内容一一提出我的观点。 3.在遵守函数约定的前提下,使用goroutine完全不是问题。举个例子: 假设要实现一个排序函数sort,约定是线程不安全的,即不允许把同一个数列在多个goroutine中同时排序。 (1) go func() { // 排序子数组 wg.Done() }() } wg.Wait() // 合并子数组 } 结论: 1.一些看似由goroutine导致的问题其实不应该归咎于goroutine

    81250发布于 2018-03-22
  • 来自专栏阶梯计划

    goroutine机制介绍

    ##How golang有一个强大的调度器维护goroutine在内核级线程上运行,确保所有的goroutine都使用且尽可能公平的使用CPU资源。 )、当前执行的goroutine、随机数发生器等等非常多的信息。 P全称是Processor,处理器,它的主要用途就是用来执行goroutine的,所以它也维护了一个goroutine队列,里面存储了所有需要它来执行的goroutine,这个P的角色可能有一点让人迷惑 goroutine调用park后,这个goroutine就会被设置位waiting状态,放弃cpu。 被park的goroutine处于waiting状态,并且这个goroutine不在小车(P)中,如果不对其调用runtime·ready,它是永远不会再被执行的。

    1.3K00发布于 2021-03-17
  • 来自专栏Reck Zhang

    Go 01 - Goroutine

    G: 表示Goroutine, 每个Goroutine都包含堆栈, 指令指针和其他用于调度的信息. P: 表示调度的上下文, 可以被看作一个运行线程M上的本地调度器. 的运行期总结为三种状态: 等待中: 表示当前Goroutine等待某些条件满足后才会继续执行, 比如当前Goroutine正在执行系统调用或者同步操作. 可运行: 表示当前Goroutine在等待某个M执行其指令, 如果当前程序中有非常多都Goroutine, 每个Goroutine就可能会等待更多都时间. 运行中: 表示当前Goroutine正在某个M上执行指令. , curg是当前线程上运行的Goroutine, 这也是作为操作系统唯二关心的Goroutine了.

    59930发布于 2021-08-11
  • 来自专栏米奇爱编程

    Goroutine调度器

    Goroutine 写过Golang程序的朋友都知道,go func就可以启动一个goroutine,但是goroutine究竟是什么呢? 但是操作系统并不知道goroutinegoroutine的调度由golang runtime负责,对应的操作系统执行体线程也是由runtime负责创建。 G 代表Goroutine,每个Goroutine对应一个G结构体,G存储Goroutine的运行栈、状态以及任务信息,可重用。 Goroutine栈采用按需动态分配的方式,初始化大小为2KB,最大为1GB(64位机器)。 P 代表Processor,逻辑处理器。P维护Goroutine各种队列,mcache和状态。 说明并没有Goroutine由于其他的Goroutine“贪婪”而“饥饿”。这需要归功于Golang runtime的后台监控线程sysmon,这是一个特殊的m,不需要绑定p可以执行。

    60320发布于 2019-08-29
  • 来自专栏Golang开发

    Go基础——Goroutine

    i < 10; i++ { go func(i int) { t.Log(i) }(i) } } 编译器/解释器/虚拟机层面的多任务 Goroutine G(goroutine) 调度系统的最基本单位goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等。 相当于两级线程 goroutine可能的切换点 I/O,slect channel 等待锁 函数调用 runtime.Gosched() 资源竞争检测 go build -race import 6: main.count() /Users/baxiang/go/src/GoBase/main.go:15 +0x8b Goroutine 7 (running) created at: main.main() /Users/baxiang/go/src/GoBase/main.go:22 +0x77 Goroutine 6 (running) created

    67020发布于 2019-05-29
  • 来自专栏LinkinStar's Blog

    图解goroutine调度

    G 表示goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等;另外G对象是可以重用的。 M M代表着真正的执行计算资源。 goroutine到哪里去了呢? 从这里我们可以发现,其实goroutine的调度器整个就是一个小型的操作系统,内部去造出了类似的部件去完成goroutine的实现,而因为是在内部实现,所以解决了操作系统层面所带来的线程创建慢等问题。 运行的函数 void* param; // 用于传递参数,睡眠时其它goroutine设置param,唤醒时此goroutine可以获取 int16 status G 处理信号的goroutine void (*mstartfn)(void); G* curg; // M中当前运行的goroutine P*

    39230编辑于 2022-09-01
  • 来自专栏Golang语言社区

    Goroutine调度器

    当我们创建了很多的goroutine,并且它们都是跑在同一个内核线程之上的时候,就需要一个调度器来维护这些goroutine,确保所有的goroutine都使用CPU,并且是尽可能公平的使用CPU资源。 P全称是Processor,处理器,它的主要用途就是用来执行goroutine的,所以它也维护了一个goroutine队列,里面存储了所有需要它来执行的goroutine,这个P的角色可能有一点让人迷惑 ,这个goroutine将执行的函数是runtime.main,这第一个goroutine也就是所谓的主goroutine。 一个真正干活的Go程序,一定创建有不少的goroutine,所以在Go程序开始运行后,就会向调度器添加goroutine,调度器就要负责维护好这些goroutine的正常执行。 goroutine调用park后,这个goroutine就会被设置位waiting状态,放弃CPU。

    80020发布于 2018-07-26
  • 来自专栏Python程序员杂谈

    Goroutine VS Coroutine

    前几天flisky分享了Goroutine的方面的东西,之后我忙着做git原理的分享没来得及总结,赶紧总结下,夜长梦多难免遗忘。 Goroutine这个东西其实挺好理解的,有了对tornado的理解,这个东西其实类似,只不过tornado是基于框架的ioloop,而Goroutine是基于语言的"ioloop"——这里加引号表示其实我现在不太明白具体是什么 个人理解它是在运行时提供了类似于os的进程调度机制(感谢@monnand指正),然后它的每一个Goroutine都相当于一个进程,这样才有了Goroutine抢占式的特性(目前版本还没有实现抢占式)。 下面来通过两段代码来对比Python的Coroutine(协程)和Go的Goroutine。 从subtask中返回的值根本就不是按照顺序来的,也就是说主进程开启了10个Goroutine,这10个Goroutine在一定程度上是并发执行的。

    1.1K20发布于 2019-03-01
  • 来自专栏Golang语言社区

    无辜的goroutine

    简介: 本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go语言中goroutine的使用》提出了goroutine的几宗罪。 实际上goroutine确实有增加程序复杂度而容易导致问题之处,特别是死锁;但是另外的一些指控,我认为实际上goroutine是没有直接责任的。 以下就《论go语言中goroutine的使用》的内容一一提出我的观点。 3.在遵守函数约定的前提下,使用goroutine完全不是问题。举个例子: 假设要实现一个排序函数sort,约定是线程不安全的,即不允许把同一个数列在多个goroutine中同时排序。 (1) go func() { // 排序子数组 wg.Done() }() } wg.Wait() // 合并子数组 } 结论: 1.一些看似由goroutine导致的问题其实不应该归咎于goroutine

    745110发布于 2018-03-26
  • 来自专栏跟着asong学Golang

    请勿滥用goroutine

    Go语言中,goroutine的创建成本很低,调度效率很高,人称可以开几百几千万个goroutine,但是真正开几百几千万个goroutine就不会有任何影响吗? 本文我们就一起来看一看goroutine是否有数量限制并介绍几种正确使用goroutine的姿势~。 现状 在Go语言中,goroutine的创建成本很低,调度效率高,Go语言在设计时就是按以数万个goroutine为规范进行设计的,数十万个并不意外,但是goroutine在内存占用方面确实具有有限的成本 goroutine就是G-P-M调度模型中的G,我们可以把goroutine看成是一种协程,创建goroutine也是有开销的,但是开销很小,初始只需要2-4k的栈空间,当goroutine数量越来越大时 的数量 我们可以通过以下方式达到控制goroutine数量的目的,不过本身Go的goroutine就已经很轻量了,所以控制goroutine的数量还是要根据具体场景分析,并不是所有场景都需要控制goroutine

    66912编辑于 2022-07-11
  • 来自专栏poslua

    Goroutine 泄露排查

    测试的客户端仅仅 30 个左右,基本都不会很活跃,但是却看到 goroutine 在持续上涨。怎么查出那些异常的 goroutine 呢? 获取 /debug/pprof/goroutine 第一种方法会丢失第一现场,并且很难溯源,所以一般在很早期的测试时使用。 就拿我的这次案例来说,直接通过 HTTP 地址就可以拿到所有的 goroutine 概况: ? 可以看到一共有 288 个 goroutine, 但是客户端只有 29 个(一读一写还有一个消息重传),消息重传却有 154 个(理论上也应该是 29 个)。 修复后,可以看到 goroutine 的曲线明显趋于平缓: ?

    1.7K20发布于 2019-08-19
  • 来自专栏Golang语言社区

    Goroutine + Channel 实践

    goroutine不同于thread,threads是操作系统中的对于一个独立运行实例的描述,不同操作系统,对于thread的实现也不尽相同;但是,操作系统并不知道goroutine的存在,goroutine ,Golang有自己的调度器,许多goroutine的数据都是共享的,因此goroutine之间的切换会快很多,启动goroutine所耗费的资源也很少,一个Golang程序同时存在几百个goroutine channel本身并没有什么神奇的地方,但是channel加上了goroutine,就形成了一种既简单又强大的请求处理模型,即N个工作goroutine将处理的中间结果或者最终结果放入一个channel V0.5: 等待一组goroutine的返回 将任务经过分组,交由不同的goroutine进行处理,最终再将每个goroutine处理的结果进行合并,这个是比较常见的处理流程。 这里需要用到WaitGroup来对一组goroutine进行同步。

    1.1K40发布于 2018-03-27
  • 来自专栏Golang语言社区

    morestack与goroutine pool

    所以我要说的是另一个方向,goroutine pool。 其实goroutine这么轻量的东西,其实本身做池意义并不大,随用随开,用完就扔,挺好的。 采用pool之后,如果goroutine被扩栈了,再还到pool里面,下次拿出来时是一个已扩栈过的goroutine,因此可以避免morestack。 接下来说说这个goroutine pool该怎么写。 每次使用都打上最后使用的时间,多起一个回收的goroutine定期的扫描池子内的goroutine,如果很久没用过,就回收掉。 这个回收的goroutine如果发现池子里一个goroutine都没了,那它自己也退出,非常干净,完全不会有泄漏。退出前要加个标记,如果池子又被使用了,重新创建回收goroutine起来工作。

    1.7K60发布于 2018-03-27
领券