Vad är en trådpool?

Hur skulle man implementera en trådpool? Jag har läst på Wikipedia för ”threadpool” men jag kan fortfarande inte ta reda på vad man ska göra för att lösa denna fråga (möjligen för att jag inte helt förstod vad en threadpool är i enkla termer).

Kan någon förklara mig på vanlig engelska vad en trådpool är och hur skulle man svara på den här frågan?

Svar

En tråd pool är en grupp förinstansierade, lediga trådar som står redo att få arbete. Dessa är att föredra framför att starta nya trådar för varje uppgift när det finns ett stort antal korta uppgifter att göra snarare än ett litet antal långa. Detta förhindrar att du måste ådra dig kostnaden för att skapa en tråd ett stort antal gånger.

Implementeringen varierar beroende på miljö, men i förenklade termer behöver du följande:

  • Ett sätt att skapa trådar och hålla dem i viloläge. Detta kan åstadkommas genom att varje tråd väntar vid en barriär tills poolen ger det arbete. (Detta kan göras med mutexes också.)
  • En behållare för att lagra de skapade trådarna, till exempel en kö eller någon annan struktur som har ett sätt att lägga till en tråd i poolen och dra ut en.
  • Ett standardgränssnitt eller abstrakt klass för trådarna att använda för att göra arbete. Det här kan vara en abstrakt klass som heter Task med en execute() -metod som gör jobbet och sedan återvänder.

När trådpoolen skapas kommer den antingen att initiera ett visst antal trådar för att göra tillgängliga eller skapa nya efter behov beroende på behoven för implementeringen.

När poolen får en Task, det tar en tråd från behållaren (eller väntar på att en blir tillgänglig om behållaren är tom), ger den en Task, och möter barriären. Detta får ledig tråd att återuppta körningen och åberopar execute() -metoden för Task den gavs. När körningen är klar lämnar tråden sig tillbaka till poolen för att läggas i behållaren för återanvändning och möter sedan dess barriär och lägger sig i vila tills cykeln upprepas.

Kommentarer

  • En trådpool är en grupp förinstanserade, lediga trådar som står redo att få arbete. […] Detta förhindrar att du måste ådra dig kostnaden för att skapa en tråd ett stort antal gånger. – detta bör spottas av Google när någon söker efter ” tråd pool ”
  • Skapar trådpool skapande barriär internt? Kan du dela referens på dessa rader?
  • @overexchange Nej, det gör det inte. Min hänvisning till denna fråga var som ett exempel på ett bättre sätt att skriva om din barriärfråga . (Om du gör det kommer jag att skriva ett svar.)
  • ett av de bästa korta svaren.

Svar

Trådpool är en samling hanterade trådar som vanligtvis är organiserade i en kö, som utför uppgifterna i uppgiftskön.

Det är dyrt att skapa ett nytt trådobjekt varje gång du behöver något som ska köras asynkront. I en trådpool skulle du bara lägga till de uppgifter du vill att ska utföras asynkront i uppgiftskön och trådpoolen tar hand om att tilldela en tillgänglig tråd, om någon, för motsvarande uppgift. Så snart uppgiften är klar begär den nu tillgängliga tråden en annan uppgift (förutsatt att det finns kvar).

Trådpoolen hjälper dig att undvika att skapa eller förstöra fler trådar än vad som verkligen skulle vara nödvändigt.

Jag skulle börja med att skapa en klass med en trådkö och en uppgiftskö. Implementera sedan en metod som lägger till en uppgift i uppgiftskön och fortsätter därifrån. Uppenbarligen bör du också göra det möjligt att ställa in maximalt tillåtna trådar i en trådpool.

Svar

Real Life Exempel;

  1. Anläggning: Operativsystem
  2. Avsnitt: Applikationer
  3. Personer: Trådar

Du har en anläggning där 12 personer arbetar. Det finns 3 delar av denna anläggning. Kök, toaletter och säkerhet. Om du inte använder trådpoolteknik, så fungerar det: Alla 12 personer kommer att stå i ett mötesrum, om nya kunder kommer per anläggning och ber om uppgifter, så kommer du att separera personer i grupper och skicka dem att göra sitt arbete och komma tillbaka till mötesrummet. Men innan de går till sin tjänst finns det en förberedelsefas. De måste bära korrekt uniform, utrusta vissa apparater och gå till det avsnittet, avsluta arbetet och komma tillbaka. Så, en gång varje gång de avslutar sitt jobb (trådändar) måste de gå tillbaka till mötesrummet, klä av sig uniform, ta ut utrustning och vänta på nästa jobb. Dessa hänvisar till att skapa trådkontext, det är minnestilldelning och spårningsinformation via OS.Det är för mycket tidskrävande för OS att omorganisera nya trådbehov.

Om du använder trådpooling kommer du tidigt på morgonen att tilldela 6 personer i köket, 2 personer i toaletten och 4 personer till säkerhet. Så de kommer bara att göra sin förberedelse en gång om dagen. Även om det inte finns några kunder vid köket, kommer de 4 personerna att vara där på tomgång för eventuella kommande uppgifter. De behöver inte gå tillbaka till mötesrummet förrän köket stängs (appen slutar). Dessa fyra personer är i poolen Kitchen app och redo att servera snabbt. Men du kan inte lova att de arbetar hela dagen, eftersom köket kan bli tomgång ibland. Samma logik gäller även för toaletter och säkerhet.

I det första scenariot slösar du inte bort någon tråd för någon uppgift, MEN det tar lång tid att förbereda varje enskild tråd för varje uppgift. I den andra förbereder du trådar i förväg, så du kan inte garantera att du kommer att använda alla trådar för alla uppgifter, men OS gör mestadels stor optimering på det, så att du säkert kan lita på det.

Svar

I flertrådad applikation är trådpoolen en ”pool med tillgängliga trådar” som kan användas av din applikation. Vanligtvis, t.ex. .NET, allt hanteras så att du bara tilldelar uppgifter och när en tråd är ledig kommer den att utföra den. Så för att implementera en trådpool, skulle jag förvänta mig att skapa ett koncept där uppgifter automatiskt tas av fria trådar utan uttrycklig trådskapande för varje uppgift.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *