Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Mengembalikan Respons?

Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Mengembalikan Respons?

Barbara Streisand
Lepaskan: 2024-10-29 09:10:02
asal
1026 orang telah melayarinya

How to Gracefully Shut Down an HTTP Server After Returning a Response?

Mematikan pelayan HTTP selepas membalas respons

Anda sedang membangunkan bot baris arahan yang berinteraksi dengan API Instagram menggunakan OAuth, yang tidak dioptimumkan untuk baris arahan aplikasi. Untuk mengatasinya, anda telah menyediakan pelayan HTTP tempatan sebagai URI ubah hala untuk kebenaran. Selepas pengguna membenarkan aplikasi dan diubah hala ke pelayan, anda ingin menutup pelayan sebaik sahaja token akses telah dipaparkan.

Anda telah menghadapi masalah semasa melaksanakan mekanisme penutupan. Khususnya, memanggil srv.Shutdown(nil) dalam pengendali permintaan (showTokenToUser) membawa kepada ralat:

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference
Salin selepas log masuk

Penyelesaian

Isu timbul kerana anda memanggil srv.Shutdown(nil) beberapa kali:

  1. Dalam pengendali showTokenToUser, di mana ia terletak dalam penutupan.
  2. Selepas pengendali selesai melaksanakan dalam fungsi utama.

Memanggil srv.Penutupan semasa pelayan masih mendengar sambungan membawa kepada keadaan perlumbaan. ListenAndServe() goroutine cuba untuk menutup pendengar terbuka dan sambungan melahu, tetapi ia terganggu oleh panggilan berikutnya kepada Shutdown dalam penutupan pengendali. Keadaan tidak konsisten ini mencetuskan panik.

Untuk menyelesaikan isu ini, anda boleh menggunakan salah satu daripada dua kaedah:

1. Gunakan context.WithCancel:

Dalam pendekatan ini, anda mencipta konteks.Konteks dengan fungsi batal. Konteks dihantar ke goroutine ListenAndServe dan fungsi pengendali showTokenToUser. Di dalam pengendali, apabila token akses telah dipaparkan kepada pengguna, anda memanggil fungsi batal untuk menamatkan konteks. Gorutin ListenAndServe akan menutup pelayan dengan anggun apabila konteksnya dibatalkan.

2. Gunakan Konteks yang sama:

Daripada memanggil konteks.DenganBatal, anda boleh menghantar konteks yang sama.Konteks kepada goroutine ListenAndServe dan fungsi pengendali. Apabila token akses dipaparkan, anda memanggil cancel() pada konteks, yang akan mencetuskan penutupan kedua-dua pengendali dan goroutine ListenAndServe.

Selepas melaksanakan mana-mana pendekatan, ingat untuk menunggu fungsi srv.Shutdown untuk diselesaikan sebelum keluar dari program.

Atas ialah kandungan terperinci Bagaimana untuk Mematikan Pelayan HTTP dengan Anggun Selepas Mengembalikan Respons?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan