Rumah > pembangunan bahagian belakang > Golang > Mengapakah `runtime.Gosched()` Penting untuk Mengantara Output Goroutine dalam Program Go Berjalur Tunggal?

Mengapakah `runtime.Gosched()` Penting untuk Mengantara Output Goroutine dalam Program Go Berjalur Tunggal?

DDD
Lepaskan: 2024-12-21 12:30:10
asal
258 orang telah melayarinya

Why is `runtime.Gosched()` Crucial for Interleaving Goroutine Output in Single-Threaded Go Programs?

Mengapa Runtime.Gosched() Diperlukan untuk Output Interleaving?

Dalam versi Go yang lebih awal, kod di bawah menunjukkan tingkah laku yang tidak dijangka apabila runtime.Gosched() ialah dialih keluar:

package main

import (
    "fmt"
    "runtime"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        runtime.Gosched()
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}
Salin selepas log masuk

Output dengan runtime.Gosched():

hello
world
hello
world
hello
world
hello
world
hello
Salin selepas log masuk

Output tanpa runtime.Gosched():

hello
hello
hello
hello
hello
Salin selepas log masuk

Memahami Peranan runtime.Gosched()

Apabila Go dijalankan tanpa menyatakan pembolehubah persekitaran GOMAXPROCS, semua goroutine dijadualkan untuk pelaksanaan dalam satu utas OS. Untuk menjadikan atur cara kelihatan berbilang benang, penjadual Go mesti sekali-sekala menukar konteks pelaksanaan.

Berbilang Tugas Koperasi:

Go menggunakan model berbilang tugas kooperatif, bermakna gorouti mesti secara eksplisit menghasilkan kawalan kepada goroutine lain. Ini berbeza dengan berbilang tugas awalan dalam urutan OS, di mana penjadual menukar konteks pelaksanaan secara telus.

Fungsi masa jalan.Gosched():

Jika tiada tugasan berbilang preemptif , runtime.Gosched() membenarkan goroutine menghasilkan kawalan kepada penjadual. Apabila goroutine mencapai panggilan Gosched, penjadual mengarahkannya untuk menukar pelaksanaan kepada goroutine lain.

Dalam contoh yang disediakan, mengalih keluar Gosched bermakna konteks pelaksanaan tidak pernah meninggalkan rutin utama. Akibatnya, goroutine "dunia" tidak dibenarkan dijalankan dan tiada mesej "dunia" dicetak.

GOMAXPROCS: Menentukan Bilangan Benang

Menetapkan GOMAXPROCS kepada nombor positif ( cth., runtime.GOMAXPROCS(2)) membenarkan Go mencipta sehingga bilangan urutan asli itu. Jika GOMAXPROCS lebih besar daripada 1, goroutin boleh dijadualkan untuk dijalankan dalam urutan yang berbeza, yang membawa kepada keselarian sebenar.

Dengan GOMAXPROCS ditetapkan kepada 2 atau ke atas, goroutin dalam contoh akan disilang, walaupun tanpa masa jalan.Gosched (), menunjukkan berbilang tugas awalan.

Atas ialah kandungan terperinci Mengapakah `runtime.Gosched()` Penting untuk Mengantara Output Goroutine dalam Program Go Berjalur Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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