// Schrijf een asynchrone taakverwerker als bibliotheek // De klant geeft een object (Task) door met gegevens voor het uitvoeren van de taak, // in ons voorbeeld gebruiken we een lege structuur. // De verwerker kan niet meer dan N taken tegelijk verwerken, // en niet meer dan X taken kunnen in de wachtrij worden geplaatst voor verwerking. // Als er geen ruimte in de wachtrij is, geven we onmiddellijk een fout terug aan de klant. // Een taak wordt in behandeling genomen als er vrije verwerkers beschikbaar zijn. // We simuleren de verwerkingstijd met time.Sleep(5*time.Second). // Zodra een taak is voltooid, nemen we de volgende uit de wachtrij. // Als de wachtrij leeg is, wachten we op nieuwe taken van klanten. // Met een sterretje: breid de Task-structuur uit en verkrijg de status van taken via een aparte aanvraag package scheduler type Scheduler interface { AddTask(t Task) error Close() } type Task interface { Do() }
Golang
Kun je beschrijven wat je gebruikt om de kanaal te lezen in de worker goroutine?
Heeft u vragen voor mij?
Kan een goroutine rechtstreeks naar een andere goroutine schrijven bij een gebufferd kanaal?
Heb je besloten om WaitGroup te schrijven omdat er een kanaal verscheen of omdat je goroutines voor iets besloot te schrijven?
// De klant geeft een object (Task) door met gegevens voor het uitvoeren van de taak, // in ons voorbeeld gebruiken we een lege structuur. // // De scheduler kan niet meer dan N taken tegelijk verwerken, // en niet meer dan X taken kunnen in de wachtrij staan. // Als er geen ruimte in de wachtrij is, geven we onmiddellijk een fout terug aan de klant. // // Een taak wordt verwerkt als er vrije verwerkers beschikbaar zijn. // We simuleren de verwerkingstijd met time.Sleep(5*time.Second). // Zodra een taak is voltooid, pakken we de volgende uit de wachtrij. // Als de wachtrij leeg is, wachten we op nieuwe taken van klanten. // // Met een sterretje: breid de Task-structuur uit en verkrijg de status van taken via een aparte aanvraag. package scheduler type Scheduler interface { AddTask(t Task) error Close() } type scheduler struct { queue chan Task wg sync.WaitGroup } func New(workers, queue int) Scheduler { // implementatie in afwachting } type Task interface { Do() }
Welke technologie/tool gebruik je?
Welke indexertypes worden gebruikt in PostgreSQL naast B-tree?
Wat was jouw rol bij het nemen van architecturale beslissingen tijdens de ontwikkeling van de zoekservice?
Heb je CTE gebruikt? Vertel wat het is.
func New(workers, queue, int) Scheduler { s := &scheduler { queue := make(chan Task, queue) for i := 0; i < workers; i++ { wg.Add(1) go func() { defer wg.Done() for task := range s.queue { task.Do() } }() } } return s } func (s *scheduler) Close() { close(s.queue) s.wg.Wait() } type Task interface { Do() }
Hoe zouden we extern fouten kunnen afhandelen die in taken optreden, als we dat wilden doen?
Heb je in de praktijk contexten gebruikt? Vertel me.
Kan je een index alleen op de replica maken, maar niet op de master?
Zijn er nog dataraces in de implementatie? Vooral in de methode Keys, die een slice van sleutels retourneert?
Wil je een klassieke worker pool schrijven?
Heeft u ervaring met het schrijven van Kubernetes-operators, het beheren van operators, Helm Chart?
Wat is het verschil tussen SELECT FOR UPDATE en SELECT FOR SHARE?
Soorten replicatie in PostgreSQL
Is werken alleen toegestaan binnen het grondgebied van de Russische Federatie?