操作系统例程在io上是否阻塞OS线程?

问题描述 投票:0回答:1

我的机器上有4个逻辑处理器。因此,有四个上下文P1P2P3P4与OS线程M1M2M3M4]配合使用>

$ lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  2
Core(s) per socket:  2
Socket(s):           1

在下面的代码中:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func getPage(url string) (int, error) {
    resp, err := http.Get(url)
    if err != nil {
        return 0, err
    }

    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return 0, err
    }

    return len(body), nil
}

func worker(urlChan chan string, sizeChan chan<- string, i int) {
    for {
        url := <-urlChan
        length, err := getPage(url)
        if err == nil {
            sizeChan <- fmt.Sprintf("%s has length %d (%d)", url, length, i)
        } else {
            sizeChan <- fmt.Sprintf("%s has error %s (%d)", url, err, i)
        }
    }
}

func main() {

    urls := []string{"http://www.google.com/", "http://www.yahoo.com",
        "http://www.bing.com", "http://bbc.co.uk", "http://www.ndtv.com", "https://www.cnn.com/"}

    urlChan := make(chan string)
    sizeChan := make(chan string)

    for i := 0; i < len(urls); i++ {
        go worker(urlChan, sizeChan, i)
    }

    for _, url := range urls {
        urlChan <- url
    }

    for i := 0; i < len(urls); i++ {
        fmt.Printf("%s\n", <-sizeChan)
    }

}

有六个执行http.Get()的例程


1)

OS线程(M1)是否在io(G1)上被go-routine(http.Get())阻塞了?关于上下文P1

Go调度程序是否在G1之后从OS线程(M1)抢占了例程(http.Get())?并将G2分配给M1 ...如果是,在抢占G1时,Goruntime如何管理G1以在IO(G1)完成时恢复http.Get

2)

用于检索每个go-routine(G)的上下文号(P)的api是什么?用于调试。.

我的机器上有4个逻辑处理器。因此有四个上下文P1,P2,P3和P4与OS线程M1,M2,M3和M4一起使用$ lscpu体系结构:x86_64 CPU op-mode:32 -...

go goroutine
1个回答
1
投票
不,它不会阻止。我的粗略了解(并且是无源的,我是通过渗透来了解的)是,每当goroutine想要执行具有等效非阻塞版本的“阻塞” I / O时,
© www.soinside.com 2019 - 2024. All rights reserved.