Rumah >pembangunan bahagian belakang >Golang >Mengapa Infinite-Loop Goroutines Menyekat Pelayan HTTP Go Walaupun `runtime.GOMAXPROCS` dan `runtime.LockOSThread()`?

Mengapa Infinite-Loop Goroutines Menyekat Pelayan HTTP Go Walaupun `runtime.GOMAXPROCS` dan `runtime.LockOSThread()`?

Linda Hamilton
Linda Hamiltonasal
2024-12-07 00:15:16707semak imbas

Why Do Infinite-Loop Goroutines Block Go's HTTP Server Despite `runtime.GOMAXPROCS` and `runtime.LockOSThread()`?

Goroutine Infinite Loop Menyekat Pelayan HTTP dalam Go

Bahasa pengaturcaraan Go membolehkan penciptaan goroutin serentak yang berjalan selari. Walau bagaimanapun, pemerhatian baru-baru ini telah menimbulkan kebimbangan tentang kelakuan goroutin gelung tak terhingga dalam pelayan HTTP.

Menurut dokumentasi Go, menetapkan masa jalan.GOMAXPROCS(8) dengan 8 teras CPU harus membenarkan gorouti berjalan selari tanpa menghalang satu sama lain. Walau bagaimanapun, ini tidak berlaku apabila menggunakan pakej net/http. Goroutine gelung tak terhingga nampaknya menyekat pelayan selepas beberapa permintaan.

Isu ini tidak terhad kepada kod, kerana ia berterusan walaupun masa jalan.LockOSThread() ditambahkan pada goroutin gelung tak terhingga. Ini adalah tidak dijangka kerana masa jalan.LockOSThread() harus memastikan bahawa gelung berjalan dalam urutan yang berasingan, membebaskan gorout lain untuk terus melaksanakan.

Penjelasan

Waktu jalan Go penjadual bukanlah pre-emptive sepenuhnya. Sekiranya tiada panggilan fungsi, seperti dalam kes kod gelung tak terhingga, penjadual tidak dicetuskan. Ini membolehkan goroutine gelung tak terhingga memonopoli CPU dan menghalang gorout lain daripada dilaksanakan.

Penyelesaian

Terdapat beberapa penyelesaian yang mungkin untuk isu ini:

  • Tambah kandungan pada gelung tak terhingga: Oleh menambahkan panggilan badan atau fungsi pada gelung tak terhingga, penjadual akan dicetuskan dengan lebih kerap dan gorout lain akan berpeluang untuk dijalankan.
  • Panggil masa jalan secara kerap.Gosched: Masa jalan.Gosched () fungsi boleh digunakan untuk menghasilkan penjadual secara manual, membenarkan goroutine lain untuk dilaksanakan. Pendekatan ini mungkin tidak sesuai untuk aplikasi sensitif prestasi.

Adalah penting untuk ambil perhatian bahawa masa jalan.LockOSThread() tidak mengasingkan gelung sepenuhnya dalam urutan berasingan. Ia membenarkan gelung berjalan pada mana-mana urutan, tetapi penjadual mungkin masih mengganggunya jika gorout lain memerlukan pelaksanaan.

Atas ialah kandungan terperinci Mengapa Infinite-Loop Goroutines Menyekat Pelayan HTTP Go Walaupun `runtime.GOMAXPROCS` dan `runtime.LockOSThread()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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