helloworld12
V2EX  ›  问与答

golang 的模式

  •  
  •   helloworld12 · Oct 26, 2018 · 2728 views
    This topic created in 2930 days ago, the information mentioned may be changed or developed.

    golang 的调度模式

    可以让你,用阻塞同步的方式获得非阻塞异步的性能... 不知道这个理解是否正确

    同步异步阻塞非阻塞

    就是当一个协程碰到各种,IO,syscall 的时候,当前协程进入到 wait 状态,线程切换到别可以运行的协程去运行(不会浪费 CPU 的时间),等 IO,syscall 完成后,在让原来的协程进入到 runable 状态

    9 replies  •  2018-10-26 09:23:48 +08:00
    Valyrian
    Valyrian
    Oct 26, 2018
    1
    多线程不都是这样吗,和 golang 有什么关系
    shutongxinq
    shutongxinq
    Oct 26, 2018
    2
    Golang 确实是这样的,不会 busy waiting,没有 spin lock。
    @Valyrian C++怎么自动这样?
    Valyrian
    Valyrian
    Oct 26, 2018
    3
    @shutongxinq C++你除非明确写出来 while true 这种东西,就不是 spin lock 啊,等待 io 的时候干什么是内核决定的,现在内核早就不 spin lock 了
    Valyrian
    Valyrian
    Oct 26, 2018
    4
    @shutongxinq 等待 io 的时候内核可以让 cpu 去跑程序的的其他线程,或者系统里别的进程
    shutongxinq
    shutongxinq
    Oct 26, 2018
    5
    @Valyrian 你也是学过 15640 的校友,怎么就不明白...他说 golang 搞了一个 block 自动 wait 的机制,提供了另外一种 abstraction。你 C++里面显然要 monitor semaphore 同步啊,不然读一个值没有,难道不是直接报错吗?怎么做到自动 wait ?
    Valyrian
    Valyrian
    Oct 26, 2018
    6
    @shutongxinq 你说的是 golang 能自动 select ?那确实是自动的。。但是我完全没看出来 op 这句话在说这个

    > 就是当一个协程碰到各种,IO,syscall 的时候,当前协程进入到 wait 状态,线程切换到别可以运行的协程去运行(不会浪费 CPU 的时间),等 IO,syscall 完成后,在让原来的协程进入到 runable 状态
    hjc4869
    hjc4869
    Oct 26, 2018 via iPhone
    7
    其实这种 feature 在 C/C++下都是一个库就能实现的
    helloworld12
    helloworld12
    OP
    Oct 26, 2018
    8
    @shutongxinq #5 15640 这个? 15-440/640, Fall 2018: Distributed Systems https://www.synergylabs.org/courses/15-440/
    innoink
    innoink
    Oct 26, 2018 via Android
    9
    其实就是实现了一个用户态协程调度器而已。其实这种东西早就有了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2991 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 04:38 · PVG 12:38 · LAX 20:38 · JFK 23:38
    ♥ Do have faith in what you're doing.