🔧 Задача для собеседования на Go: Реализация кастомной WaitGroup на семафоре
Условие: Нужно реализовать аналог sync.WaitGroup с использованием семафора на базе канала. Семафор должен ожидать завершения N горутин, используя минимальные аллокации памяти.
Решение:
package main
import ( "fmt" )
type sema chan struct{}
func New(n int) sema { return make(sema, n) }
func (s sema) Inc(k int) { for i := 0; i < k; i++ { s <- struct{}{} } }
func (s sema) Dec(k int) { for i := 0; i < k; i++ { <-s } }
for _, num := range numbers { go func(n int) { fmt.Println(n) sem.Inc(1) }(num) }
sem.Dec(n) }
Пояснение: 1️⃣ Семафор реализован как канал пустых структур chan struct{} для минимизации аллокаций 2️⃣ Буферизированный канал создается с размером, равным количеству горутин 3️⃣ Каждая горутина при завершении кладет значение в канал (Inc) 4️⃣ Главная горутина ожидает завершения всех горутин, вычитывая значения (Dec) 5️⃣ Когда все горутины завершатся, канал опустеет и выполнение продолжится
🔧 Задача для собеседования на Go: Реализация кастомной WaitGroup на семафоре
Условие: Нужно реализовать аналог sync.WaitGroup с использованием семафора на базе канала. Семафор должен ожидать завершения N горутин, используя минимальные аллокации памяти.
Решение:
package main
import ( "fmt" )
type sema chan struct{}
func New(n int) sema { return make(sema, n) }
func (s sema) Inc(k int) { for i := 0; i < k; i++ { s <- struct{}{} } }
func (s sema) Dec(k int) { for i := 0; i < k; i++ { <-s } }
for _, num := range numbers { go func(n int) { fmt.Println(n) sem.Inc(1) }(num) }
sem.Dec(n) }
Пояснение: 1️⃣ Семафор реализован как канал пустых структур chan struct{} для минимизации аллокаций 2️⃣ Буферизированный канал создается с размером, равным количеству горутин 3️⃣ Каждая горутина при завершении кладет значение в канал (Inc) 4️⃣ Главная горутина ожидает завершения всех горутин, вычитывая значения (Dec) 5️⃣ Когда все горутины завершатся, канал опустеет и выполнение продолжится
Other crimes that the SUCK Channel incited under Ng’s watch included using corrosive chemicals to make explosives and causing grievous bodily harm with intent. The court also found Ng responsible for calling on people to assist protesters who clashed violently with police at several universities in November 2019. But a Telegram statement also said: "Any requests related to political censorship or limiting human rights such as the rights to free speech or assembly are not and will not be considered." Over 33,000 people sent out over 1,000 doxxing messages in the group. Although the administrators tried to delete all of the messages, the posting speed was far too much for them to keep up. A few years ago, you had to use a special bot to run a poll on Telegram. Now you can easily do that yourself in two clicks. Hit the Menu icon and select “Create Poll.” Write your question and add up to 10 options. Running polls is a powerful strategy for getting feedback from your audience. If you’re considering the possibility of modifying your channel in any way, be sure to ask your subscribers’ opinions first. The creator of the channel becomes its administrator by default. If you need help managing your channel, you can add more administrators from your subscriber base. You can provide each admin with limited or full rights to manage the channel. For example, you can allow an administrator to publish and edit content while withholding the right to add new subscribers.
from us