Mengendalikan Pengubahsuaian Peta Serentak: Dilema Recover vs. Runtime Crash
Apabila berurusan dengan akses peta serentak, seseorang mungkin menghadapi situasi pelik di mana pulih daripada panik "baca peta dan tulis peta serentak" nampaknya sia-sia. Ini kerana tingkah laku masa jalan dalam kes sedemikian bukanlah panik tetapi ranap yang disengajakan.
Dalam Go 1.6, masa jalanan memperkenalkan mekanisme pengesanan untuk penyalahgunaan peta secara serentak. Jika berbilang goroutin cuba mengubah suai peta secara serentak, masa jalan mencetuskan ranap, mencetak mesej diagnostik. Tingkah laku ini berpunca daripada bahaya yang wujud dari potensi tingkah laku yang tidak ditentukan apabila peta diakses secara serentak untuk operasi tulis.
Malangnya, pendekatan biasa menggunakan tangguh dengan pulih untuk mengendalikan panik tidak berkesan dalam senario ini. Fungsi pulih tidak boleh memintas ranap yang dimulakan oleh masa jalan. Penyelesaian yang disyorkan adalah untuk mengelakkan penyalahgunaan serentak peta sama sekali.
Dalam contoh yang disediakan:
package main import "time" var m = make(map[string]string) func main() { go func() { for { m["x"] = "foo" } }() go func() { for { m["x"] = "foo" } }() time.Sleep(1 * time.Second) }
Tulisan serentak pada peta "m" akan mencetuskan ranap masa jalan. Untuk mengelakkan ini, seseorang perlu menggunakan mekanisme penyegerakan, seperti menggunakan mutex atau saluran, untuk memastikan akses eksklusif kepada peta semasa operasi tulis.
Atas ialah kandungan terperinci Mengapakah `recover` Gagal Mengendalikan Ranap Pengubahsuaian Peta Serentak dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!