Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pergi FAQ mengatakan "Tiada ID goroutine" tetapi kita boleh mendapatkannya daripada runtime.Stack. apa itu?

Pergi FAQ mengatakan "Tiada ID goroutine" tetapi kita boleh mendapatkannya daripada runtime.Stack. apa itu?

WBOY
WBOYke hadapan
2024-02-05 22:51:03549semak imbas

Go常见问题解答说“没有goroutine ID”,但我们可以从runtime.Stack中获取它。它是什么?

Kandungan soalan

go faq menjawab soalan "Kenapa tiada id goroutine?"

goroutines do not have names; they are just anonymous workers. they expose no unique identifier, name, or data structure to the programmer.
https://go.dev/doc/faq#no_goroutine_id

Saya tidak percaya penjelasan "mereka tidak mendedahkan pengecam unik" kerana nampaknya kita boleh mendapatkan id goroutine dengan menggunakan runtime.stack().

Soalan

  1. Apakah perbezaan antara "pengecam unik" dalam jawapan go faq dan id goroutine yang diekstrak oleh runtime.stack?

  2. Mengapa go faq menjawab "Mereka tidak mendedahkan pengecam unik"?

Saya ingin memahami dengan jelas "mengapa tiada id goroutine?"

runtime.stack() nampaknya menyediakan id goroutine. https://go.dev/play/p/5b6fd7c8s6-

package main

import (
    "bytes"
    "errors"
    "fmt"
    "runtime"
    "strconv"
)

func main() {
    fmt.Println(goid())

    done := make(chan struct{})
    go func() {
        fmt.Println(goid())
        done <- struct{}{}
    }()
    go func() {
        fmt.Println(goid())
        done <- struct{}{}
    }()
    <-done
    <-done
    close(done)
}

var (
    goroutinePrefix = []byte("goroutine ")
    errBadStack     = errors.New("invalid runtime.Stack output")
)

func goid() (int, error) {
    buf := make([]byte, 32)
    n := runtime.Stack(buf, false)
    buf = buf[:n]
    // goroutine 1 [running]: ...

    buf, ok := bytes.CutPrefix(buf, goroutinePrefix)
    if !ok {
        return 0, errBadStack
    }

    i := bytes.IndexByte(buf, ' ')
    if i < 0 {
        return 0, errBadStack
    }

    return strconv.Atoi(string(buf[:i]))
}

Selain itu, terdapat cara lain untuk mendapatkan id goroutine melalui ebpf.

Bagaimana untuk mendapatkan id goroutine menggunakan ebpf


Jawapan betul


Apakah perbezaan antara "pengecam unik" dalam Soalan Lazim Go dan id goroutine yang diekstrak mengikut masa jalan.Timbunan?

Soalan Lazim menyatakan bahawa goroutine tidak mendedahkan pengecam unik, nama atau struktur data kepada pengaturcara.

Waktu jalan memerlukan cara untuk mengenal pasti Goroutine, tetapi tiada cara yang disokong untuk mendapatkan pengecam itu.

Dokumentasi Go tidak menyatakan format surih tindanan yang dikembalikan mengikut masa jalan.Timbunan atau maksud nombor goroutine. Kod dalam soalan mungkin mendapatkan id unik sekarang, tetapi tiada jaminan bahawa kod itu akan berbuat demikian pada masa hadapan.

Atas ialah kandungan terperinci Pergi FAQ mengatakan "Tiada ID goroutine" tetapi kita boleh mendapatkannya daripada runtime.Stack. apa itu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam