Kuinka ketju toteutetaan? Olen lukenut wikipediasta ”threadpool”, mutta en silti pysty selvittämään, mitä pitäisi tehdä tämän kysymyksen ratkaisemiseksi (mahdollisesti siksi, että en ymmärtänyt oikein, mikä threadpool on yksinkertaisesti).
Voisiko joku selittää minulle yksinkertaisesti englanniksi, mikä on langankierros ja miten joku vastaisi tähän kysymykseen?
Vastaus
ketju pool on ryhmä ennakoituja, käyttämättömiä ketjuja, jotka ovat valmiita saamaan työn. Ne ovat parempia kuin uusien ketjujen pikalähetys jokaiselle tehtävälle, kun on tehtävä suuri määrä lyhyitä tehtäviä eikä pieni määrä pitkiä. Tämä estää langan luomisen suuren määrän kertaluonteisia kustannuksia.
Toteutus vaihtelee ympäristön mukaan, mutta yksinkertaistetusti tarvitset seuraavaa:
- Tapa luoda ketjuja ja pitää ne lepotilassa. Tämä voidaan saavuttaa pyytämällä jokaista säiettä odottamaan esteessä, kunnes uima-allas antaa sen toimimaan. (Tämä voidaan tehdä mutexeilla samoin.)
- Säilö luotujen säikeiden, kuten jonon tai minkä tahansa muun rakenteen, tallentamiseksi, jolla on tapa lisätä ketju pooliin ja vetää yksi ulos.
- Tavallinen käyttöliittymä tai abstrakti luokka ketjuille, joita voidaan käyttää työssä. Tämä voi olla abstrakti luokka nimeltä
Task
ja menetelmäexecute()
, joka tekee työn ja palaa sitten.
Kun ketjupooli luodaan, se joko heti tietyn määrän ketjuja saataville tai luo uusia tarpeen mukaan toteutuksen tarpeiden mukaan.
Kun poolille luovutetaan Task
, se vie säiettä säiliöstä (tai odottaa, että yksi tulee saataville, jos säiliö on tyhjä), antaa sille Task
, ja täyttää esteen. Tämä saa tyhjäkäynnin säikeen jatkamaan suoritusta ja käyttää execute()
-menetelmää sille annettuun Task
-menetelmään. Kun suoritus on valmis, lanka antaa itsensä takaisin altaaseen laitettavaksi säiliöön uudelleenkäyttöä varten ja täyttää sen esteen, jolloin hän nukahtaa, kunnes sykli toistuu.
Kommentit
- Keskusteluryhmä on ryhmä ennakoituja, käyttämättömiä ketjuja, jotka ovat valmiita saamaan työtä. […] Tämä estää langan luomisen yleiskustannuksista useita kertoja. – Googlen tulisi sylkeä tämä aina, kun joku etsii " säiettä pool "
- Sisältääkö säiealueen luominen sisäisesti estettä? Voitteko jakaa viitteitä näillä riveillä?
- @overexchange Ei, se ei ole. Viittaukseni tähän kysymykseen oli esimerkki paremmasta tavasta kirjoittaa estekysymyksesi uudelleen . (Jos vastaat, kirjoitan vastauksen.)
- yksi parhaista lyhyistä vastauksista.
Vastaa
Säiejoukko on yleensä jonoon järjestetty hallittujen ketjujen kokoelma, joka suorittaa tehtävän jonossa olevat tehtävät.
Uuden säikeobjektin luominen aina, kun tarvitset jotain asynkronisesti suoritettavaa, on kallista. Lank pooliin lisätään vain tehtävät, jotka haluat suorittaa asynkronisesti tehtäväjonoon, ja lanka-allas huolehtii käytettävissä olevan säikeen määrittämisestä vastaavalle tehtävälle, jos sellainen on. Heti kun tehtävä on suoritettu, nyt käytettävissä oleva ketju pyytää toista tehtävää (olettaen, että jäljellä on vielä).
Keskusteluryhmä auttaa välttämään enemmän ketjujen luomista tai tuhoamista kuin mitä todella tarvitsisi.
Aloitan luomalla luokan, jossa on ketjujen ja tehtävien jono. Ota sitten käyttöön menetelmä, joka lisää tehtävän tehtäväjonoon ja siirtyy sieltä eteenpäin. On selvää, että sinun pitäisi myös mahdollistaa korkeimpien sallittujen säikeiden asettaminen ketjupoolissa.
Vastaa
Esimerkki todellisesta elämästä;
- Palvelu: Käyttöjärjestelmä
- Osiot: Sovellukset
- Ihmiset: Viestiketjut
Sinulla on siellä tila 12 ihmistä työskentelee. Tässä laitoksessa on 3 osiota. Keittiö, wc ja turvallisuus. Jos et käytä langankierretekniikkaa, niin se toimii: Kaikki 12 ihmistä seisovat kokoushuoneessa, jos uudet asiakkaat tulevat laitoksen luona ja pyytävät tehtäviä, erotat ihmiset ryhmiin ja lähetät heidät tekemään Heidän on käytettävä oikeaa univormua, varustettava tietyt laitteet ja käveltävä kyseiselle osastolle, lopetettava työ ja palattava takaisin. Ennen kuin he menevät tehtäväänsä, on valmistautumisvaihe. joka kerta, kun he ovat lopettaneet työnsä (ketjun loppu), heidän on mentävä takaisin neuvotteluhuoneeseen, riisuttava yhtenäinen alus, poistettava varusteet ja odotettava seuraavaa työtä. Nämä viittaavat langankontekstin luomiseen, sen muistin jakamiseen ja käyttöjärjestelmän seurantatietoihin.Käyttöliittymälle on liian aikaa vievää uusien ketjutarpeiden järjestäminen.
Jos käytät langan yhdistämistä, annat varhain aamulla 6 henkilöä keittiöön, 2 henkilöä vessaan ja 4 henkilöä turvallisuuteen. Joten he tekevät valmistelunsa vain kerran päivässä. Vaikka keittiössä ei olisikaan asiakkaita, nämä 4 ihmistä ovat siellä tyhjäkäynnillä mihin tahansa tulevaan tehtävään. Heidän ei tarvitse palata takaisin kokoushuoneeseen, ennen kuin keittiö sulkeutuu (sovellus päättyy). Nämä 4 henkilöä ovat Kitchen-sovellusaltaassa ja valmiita palvelemaan nopeasti. Mutta et voi luvata, että he työskentelevät koko päivän, koska keittiöstä voi tulla käyttämättä ajoittain. Sama logiikka pätee myös vessoihin ja turvallisuuteen.
Ensimmäisessä skenaariossa et tuhlaa mitään ketjua mihinkään tehtävään, MUTTA jokaisen yksittäisen ketjun valmisteleminen kullekin tehtävälle vie paljon aikaa. Toisessa vaiheessa valmistelet ketjut etukäteen, joten et voi taata, että käytät kaikkia ketjuja kaikkiin tehtäviin, mutta käyttöjärjestelmä optimoi sen suurimmaksi osaksi, joten voit luottaa siihen. h2> Vastaa
Monisäikeisissä sovelluksissa ketjupooli on ”käytettävissä olevien ketjujen joukko”, jota sovelluksesi voi käyttää. Yleensä esim. .NET, sitä kaikkia hallitaan, joten määrität vain tehtäviä ja kun ketju on vapaa, se aikoo suorittaa sen. Joten luodakseni threadpoolin, odotan luovan konseptin, jossa tehtävät otetaan automaattisesti ilmaisilla säikeillä ilman erillistä ketjun luomista jokaiselle tehtävälle.