V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
miaeLKK
V2EX  ›  Go 编程语言

[Go 语言] 怎么理解 goroutine 这个词?

  •  1
     
  •   miaeLKK · 2023-08-10 11:05:36 +08:00 · 2333 次点击
    这是一个创建于 455 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近新学习,知道他大概是 Go 自己创建维护的线程。想了解下这个词怎么来的,有什么含义,感觉可以更好的理解。(我貌似看到一个单词 runtime ,不知道是不是这么来的) 另外,想听到对于新手的建议、对 Go 的个人理解等关于 Go 的一切话题,请大家畅所欲言

    第 1 条附言  ·  2023-08-10 12:06:51 +08:00
    runtime 是扫到一眼,感觉也没什么联系,就是问问
    18 条回复    2023-09-11 08:05:55 +08:00
    Nooooobycat
        1
    Nooooobycat  
       2023-08-10 11:06:31 +08:00   ❤️ 1
    协程 (Coroutine), 然后把第一个 C 改成 Go 语言的 G , 就变成了 Goroutine
    arischow
        2
    arischow  
       2023-08-10 11:07:31 +08:00   ❤️ 1
    Coroutines for Go
    yazinnnn
        3
    yazinnnn  
       2023-08-10 11:07:33 +08:00
    协程版 goto
    fzls
        4
    fzls  
       2023-08-10 11:09:01 +08:00
    go 语言里的协程
    flyqie
        5
    flyqie  
       2023-08-10 11:11:58 +08:00 via Android
    协程很方便,但不要乱用,有些时候开个子进程比协程方便。
    me1onsoda
        6
    me1onsoda  
       2023-08-10 11:23:37 +08:00
    runtime 是运行时
    kiwi95
        7
    kiwi95  
       2023-08-10 11:29:53 +08:00 via Android
    来自 routine ,日程表、定期执行
    Nazz
        8
    Nazz  
       2023-08-10 11:38:15 +08:00
    当轻量级线程使就行了, 还有就是别搞什么池子
    zagfai
        9
    zagfai  
       2023-08-10 12:29:15 +08:00
    goroutine 是 go 语言设计的一种 routine ,和传统理解的 coroutine 是有区别的,会出现线程安全问题
    PTLin
        10
    PTLin  
       2023-08-10 12:30:57 +08:00
    假设有这么个模型系统。

    其中调用函数的动作不会实际调用这个函数,会返回一个叫做 task 的结构。

    有多个并行的执行流 例如多个线程,每个执行流有一个队列,创建的 task 会被放入这个队列。

    每个执行流会取出队列中的一个 task 进行实际的调用。

    系统中会提供一些特殊的函数,这些函数会暂停 task 的运行并且返回 task 未完成的状态,例如一个读取网络 socket 的函数,在无数据可读堵塞的情况下会暂停 task ,也就是暂停函数过程的执行停止到这个点上,返回 task 未完成。


    并且这时候这个特殊函数会向系统中注册一些信息,这些信息可以确保当满足某些情况下,这个未完成的 task 会被放回队列。例如当此 socket 进入了可读状态,系统就会把这个未完成的 task 放回某个队列,等待执行流执行。

    之后重新被执行流取出队列并调用的 task 会从刚才暂停的状态恢复继续执行过程,并且重试读取网络 socket ,此时会正常读取到数据,继续向下运行。重复上述过程直到一个 task 被执行完成。
    darkengine
        11
    darkengine  
       2023-08-10 12:35:27 +08:00
    本来就有 routine 这个词,指的是事务、日常工作。跟 runtime 没有关系。
    GeruzoniAnsasu
        12
    GeruzoniAnsasu  
       2023-08-10 13:05:51 +08:00
    goroutine 和 coroutine 的关系约等于 vbscript vs javascript

    根本不是什么协程,是一种混合了 OS 线程和语言 runtime 实现的用户空间线程的复杂玩意。goroutine 的调度器既要控制切换用户空间线程的上下文,还要负责维护 OS 线程和 CPU 核心调度,但这些调度过程全都无法通过语言功能手动控制……使用起来必须极其小心(因为不能手动控制线程也意味着你无法写代码显式地控制资源指派,必须永远假定资源处于竞争状态)。
    wmwm
        13
    wmwm  
       2023-08-10 13:17:37 +08:00
    很多编程语言模仿潮流,会改造一个属于自己的词,不需要过度解读。很多框架也有这样的习惯
    b00tyhunt3r
        14
    b00tyhunt3r  
       2023-08-10 13:20:40 +08:00
    @flyqie for example?
    misaka19000
        15
    misaka19000  
       2023-08-10 13:37:24 +08:00 via Android
    flyqie
        16
    flyqie  
       2023-08-10 14:26:01 +08:00 via Android
    @b00tyhunt3r #14

    协程不能强制结束,有些场景根本没法用 context ,之后还要完成清理工作。
    sherlockfff
        17
    sherlockfff  
       2023-09-11 00:14:21 +08:00
    @Nazz 我是新手,在初学时发现标准库没有协程的池,查询三方库也基本都支持的很一般或者说没有严肃认真的设计及实现。似乎官方及开发者对协程池化都抱着“不需要”的态度。

    我不太理解为什么,对于运行时创建 xx 资源这种事情,我们不是应该严格控制起来防止某些异常或未预料的情况导致频繁或大量创建而拖垮整个服务吗?
    Nazz
        18
    Nazz  
       2023-09-11 08:05:55 +08:00 via Android
    @sherlockfff runtime 已经做了 goroutine 复用相关的工作,用户层面只需要控制并发
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4482 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:08 · PVG 18:08 · LAX 02:08 · JFK 05:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.