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

WBOY
Lepaskan: 2024-02-05 22:51:03
ke hadapan
563 orang telah melayarinya

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
Salin selepas log masuk

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]))
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!