Avatar billede arnebalsby Nybegynder
06. juli 2009 - 17:56 Der er 10 kommentarer og
1 løsning

Mange samtidige Threads , er der begrænsing.

Hej C#

Jeg laver noget med nogen Asynchronous http handler i aspx.

Men jeg tror nu ikke at man behøves at kende noget til aspx eller Asynchronous http handler for at have en mening om mit spørgsmål.

I min kode har jeg behov for at køre en masse arbejde samtidig som står og venter på svar fra andre ting. Jeg har bruge for optil 10.000 eller flere af den slags processer.

P.t Starter jeg min proces op ved at skrive :
ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);
       
Og så er der en metode som hedder StartAsyncTast som er den der sover og tilsidst kalder tilbage til noget andet med en delegate.

Mit problem er at denne løsning slet ikke kan håndtere særlig mange forbindelser, når der er ca 50 StartAsyncTask igang samtidig begynder systemet at hænge, og jeg ved at det er StartAsyncTask som først bliver kaldt mange sekunder senere.

Er der noget om tråde jeg har misforstået her (det tror jeg), er det slet ikke meningen at man skal kunne køre 10.000 samtidige thread .

Jeg tænkte på at en bedre løsning måske ville være noget i stil med kun at have en thread kørende som lavede alt arbejdet for alle de forskellige request. Så skulle man bare tilføje opgaven til en liste i denne tråd, og den skulle så hver 100 ms kigge på alle opgaverne og evt kalde tilbage hvis det var overstået.

Jeg håber at nogen kan forstå mine problemer og give et inteligent svar, eller gerne nogen links og gode ord man kan søge på.

Med venlig hilsen og tak jeg har kun 15 point tilbage.
Avatar billede arne_v Ekspert
06. juli 2009 - 18:09 #1
Der er CPU overhead ved at switche mellem traade. Og hver traad bruger memory.

Traade er et yderst behageligt programmerings maessigt, men de skalerer ikke i det uendelige.

Arnes helt uautoriserede tommelfinger regel siger:
  max. 100 traade per 1 CPU core + 1 GB RAM
Avatar billede arne_v Ekspert
06. juli 2009 - 18:11 #2
Du vil faa langt bedre performance ved at have nogle thread pools og nogle work queues, hvor noget der venter ikke holder paa en blocking thread, men bare ligger og saa bliver flyttet over i en ready koe, naar den ikke skal vente laengere.
Avatar billede arnebalsby Nybegynder
06. juli 2009 - 18:29 #3
Jo. Det må blive noget i den stil. Kan dog ikke helt forstå hvorfor jeg så skulle have brug for en pool.

På den måde kan jeg vel bare klare mig med en enkelt tråd. De venter  , men når de så ikke skal vente længere, så er det de skal gøre overstået øjeblikkigt og de kan lukkes ned.

Tak for svar.
Avatar billede arne_v Ekspert
06. juli 2009 - 18:34 #4
Hvis det skal koere paa en 1 CPU core maskine saa er en enkelt traad til at processe sikkert helt fint.

Men ...
Avatar billede arnebalsby Nybegynder
06. juli 2009 - 18:56 #5
Ok. Det kan jeg godt se, at hvis der var flere cpu´er kunne det være meget smart med flere tråde.

Det kunne jo også være at hvis man sov 100 ms, og så tjekkede for 10.000 opgaver og så sov 100 ms igen, at cpu ville blive noget undeligt ujævnt belastet. Men det kunne man jo også løse selvom man stadig kun have en tråd.

Super tak for svar. Jeg blev rigtigt frustreret her til morgen da jeg opdagede at min fine nye asynkrone ting ikke virkede alligevel. men nu er jeg glad igen.
Avatar billede arne_v Ekspert
06. juli 2009 - 19:11 #6
Nu om dage bhoever du jo ikke flere CPU'er som saadan - flere CPU cores er nok.

Man kan vel ikke koebe en 1 core CPU idag.
Avatar billede arne_v Ekspert
06. juli 2009 - 19:12 #7
Og et svar fra mig.
Avatar billede arnebalsby Nybegynder
06. juli 2009 - 19:24 #8
Nå jo "flere core = flere cpu´er" mener jeg .

Jeg tror vist kun den autuelle server p.t. har en core, og den skal snart skiftes ud med en cloud server, så hvordan det er der vil jeg lige undersøge.
Avatar billede montago Praktikant
06. juli 2009 - 22:24 #9
Jeg har lavet en del løsninger efterhånden med 2-3 tråde som moser igennem en masse "arbejde"

det kan hjælpe en del at tænke som en fabrik.

1 tråd som lægger arbejds-moduler i én Queue<> (kan jo ske direkte når din handler aktiveres)

1 tråd som behandler arbejdet, og lægges i en færdig Queue<>


det hele burde ikke være et problem nu hvor det skal foregå asynkront... det straks værre hvis man forventer et synkront respons.
Avatar billede arnebalsby Nybegynder
07. juli 2009 - 00:45 #10
Tak for de mange svar, nu ved jeg min ting kommer til at virke.

Har haft svært ved at finde løsninger på mit problem da jeg søgte specifikt på det med Asynchronous http handler som der kun var lidt info om.

Og selv på MSDN står der det med

ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);

i deres eksempel, hvilket jo er rimeligt dumt.
Avatar billede arne_v Ekspert
07. juli 2009 - 03:31 #11
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester