我的机器上有4个逻辑处理器。因此,有四个上下文P1
,P2
,P3
和P4
与OS线程M1
,M2
,M3
和M4
]配合使用>
$ 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 -...