


Peta Penyegerakan boleh menyebabkan peningkatan dalam ram dan goroutine
editor php Youzi mengingatkan anda bahawa menggunakan Sync Map boleh membawa kepada peningkatan dalam RAM dan goroutine. Peta Penyegerakan ialah perpustakaan dalam bahasa Go yang digunakan untuk melaksanakan struktur data pemetaan selamat bersamaan. Walaupun ia memberikan prestasi yang cekap apabila mengendalikan bacaan dan tulis serentak, menggunakan Peta Penyegerakan boleh membawa kepada peningkatan dalam penggunaan memori dan bilangan goroutin semasa memproses data berskala besar. Oleh itu, apabila menggunakan Peta Segerak, anda perlu menimbang keseimbangan antara penggunaan dan prestasi mengikut senario perniagaan tertentu dan perlu memastikan kestabilan dan kecekapan sistem.
Kandungan soalan
Helo, ini adalah kod yang saya panggil util a collector
import ( "context" "errors" "sync" "time" ) type Collector struct { keyValMap *sync.Map } func (c *Collector) LoadOrWait(key any) (retValue any, availability int, err error) { value, status := c.getStatusAndValue(key) switch status { case 0: return nil, 0, nil case 1: return value, 1, nil case 2: ctxWithTimeout, _ := context.WithTimeout(context.Background(), 5 * time.Second) for { select { case <-ctxWithTimeout.Done(): return nil, 0, errRequestTimeout default: value, resourceStatus := c.getStatusAndValue(key) if resourceStatus == 1 { return value, 1, nil } time.Sleep(50 * time.Millisecond) } } } return nil, 0, errRequestTimeout } // Store ... func (c *Collector) Store(key any, value any) { c.keyValMap.Store(key, value) } func (c *Collector) getStatusAndValue(key any) (retValue any, availability int) { var empty any result, loaded := c.keyValMap.LoadOrStore(key, empty) if loaded && result != empty { return result, 1 } if loaded && result == empty { return empty, 2 } return nil, 0 }
Jadi tujuan utiliti ini adalah untuk bertindak sebagai cache di mana nilai yang serupa dimuatkan sekali sahaja tetapi dibaca berbilang kali. Walau bagaimanapun, apabila objek pengumpul dihantar ke berbilang goroutin, saya menghadapi peningkatan penggunaan gorotin dan ram apabila berbilang goroutin cuba menggunakan cache pengumpul. Bolehkah seseorang menjelaskan jika penggunaan peta yang disegerakkan ini betul. Jika ya, apakah sebabnya bilangan goroutine/penggunaan memori yang tinggi
Penyelesaian
Sudah tentu, kerana fungsi pembatalan konteks ctxwithtimeout
yang baru dibuat tidak dipanggil, anda mungkin menghadapi kebocoran memori. Untuk membetulkannya, tukar talian kepada:
ctxWithTimeout, cancelFunc := context.WithTimeout(context.Background(), requestTimeout) defer cancelFunc()
Jadi, anda sentiasa boleh mengosongkan semua sumber yang diperuntukkan sebaik sahaja konteks tamat tempoh. Ini sepatutnya menyelesaikan kebocoran.
Mengenai penggunaan sync.map
nampaknya baik bagi saya.
Jika ini menyelesaikan masalah anda atau terdapat isu lain yang perlu diselesaikan, sila beritahu saya, terima kasih!
Atas ialah kandungan terperinci Peta Penyegerakan boleh menyebabkan peningkatan dalam ram dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Pengambilan Model Laraveleloquent: Mudah mendapatkan data pangkalan data Eloquentorm menyediakan cara ringkas dan mudah difahami untuk mengendalikan pangkalan data. Artikel ini akan memperkenalkan pelbagai teknik carian model fasih secara terperinci untuk membantu anda mendapatkan data dari pangkalan data dengan cekap. 1. Dapatkan semua rekod. Gunakan kaedah semua () untuk mendapatkan semua rekod dalam jadual pangkalan data: USEAPP \ MODELS \ POST; $ POSTS = POST :: SEMUA (); Ini akan mengembalikan koleksi. Anda boleh mengakses data menggunakan gelung foreach atau kaedah pengumpulan lain: foreach ($ postsas $ post) {echo $ post->

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Algorithms are the set of instructions to solve problems, and their execution speed and memory usage vary. In programming, many algorithms are based on data search and sorting. Artikel ini akan memperkenalkan beberapa algoritma pengambilan data dan penyortiran. Carian linear mengandaikan bahawa terdapat array [20,500,10,5,100,1,50] dan perlu mencari nombor 50. Algoritma carian linear memeriksa setiap elemen dalam array satu demi satu sehingga nilai sasaran dijumpai atau array lengkap dilalui. Carta aliran algoritma adalah seperti berikut: kod pseudo untuk carian linear adalah seperti berikut: periksa setiap elemen: jika nilai sasaran dijumpai: pulih semula benar-benar pelaksanaan bahasa palsu c: #termasuk #termasukintmain (tidak sah) {i

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Pengurusan Sumber dalam Pemrograman GO: MySQL dan Redis Connect dan Lepaskan dalam Pembelajaran Cara Mengurus Sumber Sumber dengan betul, terutamanya dengan pangkalan data dan cache ...

Memori Redis melonjak termasuk: jumlah data yang terlalu besar, pemilihan struktur data yang tidak betul, masalah konfigurasi (seperti tetapan MaxMemory terlalu kecil), dan kebocoran memori. Penyelesaian termasuk: penghapusan data yang telah tamat tempoh, menggunakan teknologi mampatan, memilih struktur yang sesuai, menyesuaikan parameter konfigurasi, memeriksa kebocoran memori dalam kod, dan kerap memantau penggunaan memori.
