Hva er et trådbasseng?

Hvordan vil man implementere en trådpool? Jeg har lest på wikipedia for «threadpool», men jeg kan fortsatt ikke finne ut hva man skal gjøre for å løse dette spørsmålet (muligens fordi jeg ikke helt forstår hva en threadpool er i enkle vendinger).

Kan noen forklare meg på vanlig engelsk hva en threadpool er og hvordan vil man svare på dette spørsmålet?

Svar

En tråd pool er en gruppe forhåndsinstanserte, inaktive tråder som står klare til å få arbeid. Disse er foretrukket fremfor å instantiere nye tråder for hver oppgave når det er et stort antall korte oppgaver å gjøre i stedet for et lite antall lange. Dette forhindrer at du må pådra deg overhead for å lage en tråd et stort antall ganger.

Implementeringen vil variere fra miljø til side, men i forenklede termer trenger du følgende:

  • En måte å lage tråder og holde dem i inaktiv tilstand. Dette kan oppnås ved å la hver tråd vente ved en barriere til bassenget gir det til å fungere. (Dette kan gjøres med mutexes også.)
  • En beholder for å lagre de opprettede trådene, for eksempel en kø eller en hvilken som helst annen struktur som har en måte å legge til en tråd i bassenget og trekke en ut.
  • Et standard grensesnitt eller en abstrakt klasse for trådene å bruke i arbeidet. Dette kan være en abstrakt klasse kalt Task med en execute() metode som gjør jobben og deretter returnerer.

Når trådgruppen blir opprettet, vil den enten starte et visst antall tråder for å gjøre tilgjengelig eller opprette nye etter behov, avhengig av behovene til implementeringen.

Når bassenget blir levert en Task, det tar en tråd fra beholderen (eller venter på at en blir tilgjengelig hvis beholderen er tom), gir den en Task, og møter barrieren. Dette får tomgangstråden til å gjenoppta kjøringen, og påkaller execute() -metoden til Task den ble gitt. Når kjøringen er fullført, gir tråden seg tilbake til bassenget for å bli satt i beholderen for gjenbruk, og møter deretter barrieren, og legger seg i dvale til syklusen gjentas.

Kommentarer

  • En trådgruppe er en gruppe forhåndsinstanserte, inaktive tråder som står klare til å få arbeid. […] Dette forhindrer at du må pådra deg overhead for å lage en tråd et stort antall ganger. – dette bør Google spytte når noen søker etter » tråd pool »
  • Innebærer thread pool -opprettelse barriere internt? Kan du dele referanse på disse linjene?
  • @overexchange Nei, det gjør det ikke. Min referanse til dette spørsmålet var som et eksempel på en bedre måte å omskrive ditt barrierespørsmål . (Hvis du gjør det, vil jeg skrive et svar.)
  • et av de beste korte svarene.

Svar

Trådbasseng er en samling av administrerte tråder som vanligvis er organisert i en kø, som utfører oppgavene i oppgavekøen.

Det er dyrt å lage et nytt trådobjekt hver gang du trenger noe som skal utføres asynkront. I en trådgruppe vil du bare legge til oppgavene du ønsker å bli utført asynkront i oppgavekøen, og trådgruppen tar seg av å tildele en tilgjengelig tråd, hvis noen, for den tilsvarende oppgaven. Så snart oppgaven er fullført, ber den nå tilgjengelige tråden om en annen oppgave (forutsatt at det er igjen).

Trådpool hjelper deg med å unngå å opprette eller ødelegge flere tråder enn det som virkelig ville være nødvendig.

Jeg vil begynne med å lage en klasse med en tråd med køer og en kø med oppgaver. Implementer deretter en metode som legger til en oppgave i oppgavekøen og fortsett derfra. Åpenbart bør du også gjøre det mulig å sette maksimalt tillatte tråder i en trådgruppe.

Svar

Real Life Example;

  1. Anlegg: Operativsystem
  2. Seksjoner: Applikasjoner
  3. Personer: Tråder

Du har et anlegg der 12 personer jobber. Det er 3 seksjoner av dette anlegget. Kjøkken, toaletter og sikkerhet. Hvis du ikke bruker trådbassengteknikk, så fungerer det: Alle de 12 personene vil stå i et møterom, hvis nye kunder kommer med innretning og ber om oppgaver, vil du skille folk i grupper og sende dem til å gjøre arbeidet sitt, og kommer tilbake til møterommet. Men før de går til plikten, er det en forberedelsesfase. De må ha på seg riktig uniform, utstyre visse enheter og gå til den delen, fullføre arbeidet og komme tilbake. Så en gang hver gang de er ferdige med jobben sin (tråden slutter), må de gå tilbake til møterommet, kle av uniform, ta ut utstyr og vente på neste jobb. Disse refererer til å skape trådkontekst, det er minnetildeling og sporingsinformasjon fra OS.Det er for mye tidkrevende for OS å omorganisere nye trådbehov.

Hvis du bruker threadpooling, vil du tidlig morgen tildele 6 personer til kjøkken, 2 personer til toalett og 4 personer til sikkerhet. Så de vil bare gjøre forberedelsene en gang om dagen. Selv om det ikke er noen kunder på kjøkkenet, vil de 4 personene være der på tomgang for eventuelle kommende oppgaver. De trenger ikke gå tilbake til møterommet før kjøkkenet stenger (appen slutter). Disse 4 personene er i Pool-bassenget og klare til å tjene raskt. Men du kan ikke love at de jobber hele dagen, siden kjøkkenet kan bli inaktiv. Den samme logikken gjelder også for toaletter og sikkerhet.

I det første scenariet kaster du ikke bort en tråd for noen oppgave, MEN det vil ta god tid å forberede hver enkelt tråd for hver oppgave. I den andre forbereder du tråder på forhånd, så du kan ikke garantere at du vil bruke alle tråder til alle oppgaver, men OS gjør mest mulig god optimalisering av det, slik at du trygt kan stole på det.

Svar

I flertrådet applikasjon er trådbasseng en «pool av tilgjengelige tråder» som kan brukes av applikasjonen din. Vanligvis er f.eks. .NET, det hele administreres, så du tildeler bare oppgaver, og når en tråd er ledig, vil den utføre den. Så for å implementere en threadpool, forventer jeg å lage et konsept der oppgaver automatisk tas av gratis tråder uten eksplisitt trådoppretting for hver oppgave.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *