Hvordan implementerer man en threadpool? Jeg har læst på wikipedia for “threadpool”, men jeg kan stadig ikke finde ud af, hvad man skal gøre for at løse dette spørgsmål (muligvis fordi jeg ikke helt forstod, hvad en threadpool er i enkle vendinger).
Kan nogen forklare mig på almindeligt engelsk, hvad en threadpool er, og hvordan vil man svare på dette spørgsmål?
Svar
En tråd pool er en gruppe af pre-instantierede, inaktive tråde, der står klar til at blive arbejdet. Disse foretrækkes frem for at instantere nye tråde til hver opgave, når der er et stort antal korte opgaver, der skal udføres snarere end et lille antal lange. Dette forhindrer, at du behøver at pådrage dig omkostningerne ved at oprette en tråd et stort antal gange.
Implementeringen vil variere efter miljø, men i forenklede termer har du brug for følgende:
- En måde at skabe tråde på og holde dem i inaktiv tilstand. Dette kan opnås ved at hver tråd venter ved en barriere, indtil poolen giver det arbejde. (Dette kan gøres med mutexes også.)
- En container til at gemme de oprettede tråde, såsom en kø eller en hvilken som helst anden struktur, der har en måde at tilføje en tråd til puljen og trække en ud.
- En standardgrænseflade eller abstrakt klasse, som trådene kan bruges til at udføre arbejde. Dette kan være en abstrakt klasse kaldet
Task
med enexecute()
metode, der udfører arbejdet og derefter vender tilbage.
Når trådpuljen oprettes, vil den enten instantiere et bestemt antal tråde for at stille dem til rådighed, eller oprette nye efter behov afhængigt af implementeringsbehovet.
Når puljen får en Task
, det tager en tråd fra beholderen (eller venter på, at en bliver tilgængelig, hvis containeren er tom), giver den en Task
, og møder barrieren. Dette får tomgangstråden til at genoptage udførelsen ved at påkalde execute()
-metoden til Task
den blev givet. Når udførelsen er afsluttet, afleverer tråden sig selv tilbage til puljen for at blive sat i beholderen til genbrug og møder derefter sin barriere og sætter sig i dvale, indtil cyklussen gentages.
Kommentarer
- En trådpulje er en gruppe præinstanterede, inaktive tråde, der står klar til at få arbejde. […] Dette forhindrer, at du behøver at pådrage dig omkostningerne ved at oprette en tråd et stort antal gange. – dette skal spyttes af Google, når nogen søger efter ” tråd pool ”
- Indeholder thread pool oprettelse en barriere internt? Kan du dele reference på disse linjer?
- @overexchange Nej, det gør det ikke. Min henvisning til dette spørgsmål var som et eksempel på en bedre måde at omskrive dit barrierespørgsmål . (Hvis du gør det, skriver jeg et svar.)
- et af de bedste korte svar.
Svar
Trådpulje er en samling af styrede tråde, der normalt er organiseret i en kø, som udfører opgaverne i opgavekøen.
Det er dyrt at oprette et nyt trådobjekt hver gang du har brug for noget, der skal udføres asynkront. I en trådpulje tilføjer du bare de opgaver, du ønsker at blive udført asynkront, til opgavekøen, og trådpuljen sørger for at tildele en tilgængelig tråd, hvis nogen, til den tilsvarende opgave. Så snart opgaven er afsluttet, anmoder den nu tilgængelige tråd om en anden opgave (forudsat at der er tilbage).
Trådpulje hjælper dig med at undgå at oprette eller ødelægge flere tråde, end det virkelig ville være nødvendigt.
Jeg vil starte med at oprette en klasse med en kø af tråde og en kø med opgaver. Implementér derefter en metode, der tilføjer en opgave til opgavekøen og fortsætter derfra. Det er klart, at du også skal gøre det muligt at indstille de maksimalt tilladte tråde i en trådpulje.
Svar
Real Life-eksempel;
- Facilitet: Operativsystem
- Sektioner: Applikationer
- Personer: Tråde
Du har en facilitet der 12 personer arbejder. Der er 3 sektioner af denne facilitet. Køkken, toiletter og sikkerhed. Hvis du ikke bruger trådpuljeteknik, så fungerer det: Alle 12 personer vil stå i et mødelokale, hvis nye kunder kommer ad facilitet og beder om opgaver, så adskiller du folk i grupper og sender dem til at gøre deres arbejde og vende tilbage til mødelokalet. Men inden de går til deres pligt, er der en forberedelsesfase. De har brug for at bære korrekt uniform, udstyre visse enheder og gå til det afsnit, afslutte arbejdet og komme tilbage. hver gang de er færdige med deres job (tråd ender), skal de gå tilbage til mødelokalet, afklæde uniform, tage udstyr ud og vente på næste job. Disse henviser til oprettelse af trådkontekst, det er hukommelsesallokering og sporingsoplysninger fra OS.Det er for meget tidskrævende for OS at omorganisere nye trådbehov.
Hvis du bruger thread pooling, tildeler du tidligt om morgenen 6 personer til køkkenet, 2 personer til toilettet og 4 personer til sikkerhed. Så de vil kun gøre deres forberedelser en gang om dagen. Selvom der ikke er nogen kunder i køkkenet, vil de 4 personer være der på tomgang for eventuelle kommende opgaver. De behøver ikke at gå tilbage til mødelokalet, før køkkenet lukkes (appen slutter). Disse 4 personer er i poolen Kitchen-app og klar til at tjene hurtigt. Men du kan ikke love, at de arbejder hele dagen, da køkkenet kan blive inaktivt fra tid til anden. Den samme logik gælder også for toiletter og sikkerhed.
I det første scenario spilder du ikke nogen tråd til nogen opgave, MEN det tager god tid at forberede hver enkelt tråd til hver opgave. I den anden forbereder du tråde på forhånd, så du kan ikke garantere, at du bruger alle tråde til alle opgaver, men OS gør for det meste stor optimering af det, så du kan stole sikkert på det.
Svar
I multitrådet applikation er trådpulje en “pulje af tilgængelige tråde”, der kan bruges af din applikation. Normalt f.eks. .NET, det hele styres, så du tildeler bare opgaver, og når en tråd er gratis, skal den udføre den. Så for at implementere en threadpool ville jeg forvente at oprette et koncept, hvor opgaver automatisk tages af gratis tråde uden eksplicit trådoprettelse for hver opgave.