Mostra notizie nelle discussioni
  • Avatar
    ☺
    Scritto da
    Wakko Warner
    Wakkus Horribilis
    il 2017-04-17 02:29:53.0 alle 2017-04-17 02:29:53.0
    Trollate totali: 6779
    Callbacks as our Generations' Go To Statement
    http://tirania.org/blog/archive/2013/Aug-15.html

    Quoterrimo.

    **Modificato dall'autore il 17.04.2017 02:39**
    Gli Svizzeri non sono tutti ricchi - Mattia
    • Avatar
      ☺
      Scritto da
      avvelentani
      Cubicolario
      il 2017-04-17 10:17:46.0 alle 2017-04-17 10:17:46.0
      Trollate totali: 18184
      Re: Callbacks as our Generations' Go To Statement
      Scritto da: Wakko Warner
      > http://tirania.org/blog/archive/2013/Aug-15.html
      >
      > Quoterrimo.
      >
      > **Modificato dall'autore il 17.04.2017 02:39**

      Non mi pare una grande soluzione, gli stacktrace restano comunque una merda.
      I think happiness is love
      - Vladimir Putin
      • Avatar
        ☺
        Scritto da
        Wakko Warner
        Wakkus Horribilis
        il 2017-04-17 13:10:50.0 alle 2017-04-17 13:10:50.0
        Trollate totali: 6779
        Re: Callbacks as our Generations' Go To Statement
        Scritto da: avvelentani
        > Scritto da: Wakko Warner
        > > http://tirania.org/blog/archive/2013/Aug-15.html
        > >
        > > Quoterrimo.
        > >
        > > **Modificato dall'autore il 17.04.2017 02:39**
        >
        > Non mi pare una grande soluzione, gli stacktrace restano comunque una merda.

        Dipende dallo strumento che usi, se è abbastanza avanzato capisce quello che stai facendo (dopotutto async a await sono parole del linguaggio, non semplici chiamate a funzione [esempio https://blogs.msdn.microsoft.com/visualstudioalm/2... scorri giù fino allo stacktrace generato da c# vb.net]) e per te lo stacktrace è simile a quello che otterresti con una programmazione sincrona perciò chiaro e comprensibile.

        Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile. Senza devi usare le callback che rendono il codice così complesso che dopo 5 minuti che l'hai scritto già non lo capisci più e ti servono 10 minuti per ristudiartelo. Oltre a questo le callback rendono complicata e poco intuitiva la gestione degli errori. L'esempio che fa nella pagina che ho lincato nel post a cui hai risposto è un chiaro esempio di quanto più semplice da capire sia il codice scritto con async-await rispetto a quello scritto con le callback. Non solo il codice è più chiaro, ma come vedi anche la gestione degli errori è estremamente più semplice.

        Async e await rendono codice che prima era pieno di callback simile a codice sincrono, perciò molto più facile da capire per un essere umano (perché noi ragioniamo secondo passi sincroni [prima faccio questo, poi quello, poi quello]). Quello che poi farà il compilatore dietro le tende per convertirlo in un codice pieno di callback non sono affari tuoi, non deve importarti e non ti importa né ti importa di vedere il suo stacktrace... sono dettagli implementativi nascosti dal compilatore così come un linguaggio ad alto livello ti nasconde il codice macchina generato.

        Più chiaro è il codice più facile è trovare bug e scrivere codice con pochi bug. Meno bug ci sono più sicuro è il tuo software. Dopo tutti gli attacchi dell'NSA/FBI/CIA/Russia/Cina/ecc... dovrebbe oramai essere chiaro a tutti che dobbiamo creare linguaggi e strumenti che rendono la creazione di bug ed errori logici il più difficile possibile da fare... e async-await è un altro passo in questa direzione.
        Gli Svizzeri non sono tutti ricchi - Mattia
        • Avatar
          ☺
          Scritto da
          altg
          utente che non utiene
          il 2017-04-17 15:10:58.0 alle 2017-04-17 15:10:58.0
          Trollate totali: 11540
          Re: Callbacks as our Generations' Go To Statement
          > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile. Senza devi usare le callback che rendono il codice così complesso che dopo 5 minuti che l'hai scritto già non lo capisci più e ti servono 10 minuti per ristudiartelo. Oltre a questo le callback rendono complicata e poco intuitiva la gestione degli errori. L'esempio che fa nella pagina che ho lincato nel post a cui hai risposto è un chiaro esempio di quanto più semplice da capire sia il codice scritto con async-await rispetto a quello scritto con le callback. Non solo il codice è più chiaro, ma come vedi anche la gestione degli errori è estremamente più semplice.

          C'e` del vero, porca troja. Dovro` far fare qualcosa del genere anche a L.in.oleum, quando poi ci si arriva. Per ora per il multithreading ha delle operazioni di base, tra cui:

          - acquisizione di mutexes;
          - incrementi e decrementi atomici;
          - zucchero sintattico per cicli di sincronizzazione (fra l'altro usano le keyword "wait" e "waiting", pero` in quel caso non hanno nulla a che vedere con il folding di una callback).

          Per quanto riguarda la gestione dello stato in seguito a errori, si possono definire degli error handlers a capo di un'intera funzione, o a capo di un ramo e dei suoi figli (cioe` a partire da un certo livello d'indentazione): quello e` equivalente alla clausola "finally". E le risorse allocate come mutexes e memoria allocata, anche per oggetti, vengono rilasciate con una filosofia scope-based (anche nota come RAII), sicche` qualsiasi cosa non venga passata al chiamante (come valore di ritorno) viene distrutta alla fine di una funzione. Fin qui tutto bene.

          Ma le callbacks (anche con upvalues) dovrebbero essere funzioni separate (neanche si potrebbero mettere in-line, non prevede l'innesto di funzioni in altre funzioni, o le funzioni anonime/lambdas), e sarebbero un bel po' scomode. Poi ci penso quando ci arrivo...
        • Avatar
          ☺
          Scritto da
          avvelentani
          Cubicolario
          il 2017-04-17 15:33:18.0 alle 2017-04-17 15:33:18.0
          Trollate totali: 18184
          Re: Callbacks as our Generations' Go To Statement
          Scritto da: Wakko Warner
          > Scritto da: avvelentani
          > > Scritto da: Wakko Warner
          > > > http://tirania.org/blog/archive/2013/Aug-15.html
          > > >
          > > > Quoterrimo.
          > > >
          > > > **Modificato dall'autore il 17.04.2017 02:39**
          > >
          > > Non mi pare una grande soluzione, gli stacktrace restano comunque una merda.
          >
          > Dipende dallo strumento che usi, se è abbastanza avanzato capisce quello che stai facendo (dopotutto async a await sono parole del linguaggio, non semplici chiamate a funzione [esempio https://blogs.msdn.microsoft.com/visualstudioalm/2... scorri giù fino allo stacktrace generato da c# vb.net]) e per te lo stacktrace è simile a quello che otterresti con una programmazione sincrona perciò chiaro e comprensibile.

          To minimize performance impact, the number of added frames is limited to 10 by default when in Debug mode (1 in Release mode). For situations warranting more frames, this limit may be changed by defining the PPL_TASK_SAVE_FRAME_COUNT macro in the source code with the number of frames needed.


          >
          > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.

          Le chiamate bloccanti erano ancora piu` semplici.
          I think happiness is love
          - Vladimir Putin
          • Avatar
            ☺
            Scritto da
            Wakko Warner
            Wakkus Horribilis
            il 2017-04-17 16:41:20.0 alle 2017-04-17 16:41:20.0
            Trollate totali: 6779
            Re: Callbacks as our Generations' Go To Statement
            Scritto da: avvelentani
            > > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.
            >
            > Le chiamate bloccanti erano ancora piu` semplici.

            Nessuno lo mette in dubbio, ma appunto il compito delle async-await è far ritornare il codice leggibile come quando si usavano le chiamate bloccanti senza però rinunciare ai vantaggi delle chiamate non bloccanti.

            Per esempio, su IIS viene riservato un certo pool di thread per gestire le richieste, facciamo finta che siano 2000 giusto per dare un numero.
            Questi thread vengono messi in un pool di thread inattivi pronti ad essere assegnati alle varie richieste in ingresso.

            Ora immagina di avere nel tuo codice una chiamata bloccante per, chessò, fare una certa operazione su un grosso numero di righe in un database che impiega 10 secondi per eseguirsi. Questo significa che per 10 secondi interi quel thread è mantenuto occupato inutilmente in attesa di una risposta mentre il database (che è un processo esterno) fa quello che deve fare.

            Immagina ora che questo sito sia un grosso sito, utilizzato da migliaia di persone ogni secondo... e che molti di loro debbano fare operazioni simili sui dati. Arriverai al punto in cui molti di questi thread sono bloccati e il server web, raggiunti i 2000 thread occupati, non potrà fare altro che dare errore all'utente che sta cercando di avviare una nuova richiesta perché non ci sono thread disponibili a servirlo.

            Con le async-await questo problema non succede perché il thread non resta occupato ad aspettare una risposta, quello che stava facendo quel thread viene momentaneamente sospeso in attesa di una risposta dal database e il thread viene rimesso nel pool dei thread disponibili per accettare nuove connessioni. Quindi ora non stai sprecando risorse inutilmente in attesa di qualcosa su cui non hai alcun controllo.

            Ho fatto l'esempio del database ma potrebbe essere qualunque cosa... l'accesso ad un file sul filesystem, la chiamata di una API su un server di terze parti, ecc.

            Il punto è che le chiamate bloccanti sono più semplici, ma in alcuni casi non ce le possiamo permettere. Invece di usare callback incomprensibili si usano gli async-await e noi sviluppatori siamo felici perché capiamo quello che stiamo facendo e pure il cliente è felice perché il software funziona meglio.
            Gli Svizzeri non sono tutti ricchi - Mattia
            • Avatar
              ☺
              Scritto da
              ::1
              il 2017-04-17 16:59:56.0 alle 2017-04-17 16:59:56.0
              Trollate totali: 12321
              Re: Callbacks as our Generations' Go To Statement
              Scritto da: Wakko Warner
              > Scritto da: avvelentani
              > > > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.
              > >
              > > Le chiamate bloccanti erano ancora piu` semplici.
              >
              > Nessuno lo mette in dubbio, ma appunto il compito delle async-await è far ritornare il codice leggibile come quando si usavano le chiamate bloccanti senza però rinunciare ai vantaggi delle chiamate non bloccanti.
              >
              > Per esempio, su IIS viene riservato un certo pool di thread per gestire le richieste, facciamo finta che siano 2000 giusto per dare un numero.
              > Questi thread vengono messi in un pool di thread inattivi pronti ad essere assegnati alle varie richieste in ingresso.
              >
              > Ora immagina di avere nel tuo codice una chiamata bloccante per, chessò, fare una certa operazione su un grosso numero di righe in un database che impiega 10 secondi per eseguirsi. Questo significa che per 10 secondi interi quel thread è mantenuto occupato inutilmente in attesa di una risposta mentre il database (che è un processo esterno) fa quello che deve fare.
              >
              > Immagina ora che questo sito sia un grosso sito, utilizzato da migliaia di persone ogni secondo... e che molti di loro debbano fare operazioni simili sui dati. Arriverai al punto in cui molti di questi thread sono bloccati e il server web, raggiunti i 2000 thread occupati, non potrà fare altro che dare errore all'utente che sta cercando di avviare una nuova richiesta perché non ci sono thread disponibili a servirlo.
              >
              > Con le async-await questo problema non succede perché il thread non resta occupato ad aspettare una risposta, quello che stava facendo quel thread viene momentaneamente sospeso in attesa di una risposta dal database e il thread viene rimesso nel pool dei thread disponibili per accettare nuove connessioni. Quindi ora non stai sprecando risorse inutilmente in attesa di qualcosa su cui non hai alcun controllo.
              >
              > Ho fatto l'esempio del database ma potrebbe essere qualunque cosa... l'accesso ad un file sul filesystem, la chiamata di una API su un server di terze parti, ecc.
              >
              > Il punto è che le chiamate bloccanti sono più semplici, ma in alcuni casi non ce le possiamo permettere. Invece di usare callback incomprensibili si usano gli async-await e noi sviluppatori siamo felici perché capiamo quello che stiamo facendo e pure il cliente è felice perché il software funziona meglio.

              A me async/await non piace come sintassi, perché nasconde al programmatore il fatto che il metodo viene spezzato.
              Il problema degli stacktrace in codice non-blocking si risolve solo parcheggiando il vecchio stack da qualche parte, ma non è una cosa gratuita, e la soluzione microsoftara è l'unica percorribile (mi dici quanti stack frames ti servono e te li tengo).
              Il codice blocking tuttavia non è così drammatico come lo disegni, un'architettura classica con un webserver con i/o asincrono e backend con i/o sincrono funziona bene anche con grandi carichi, soprattutto se il backend ha threadpool dinamici (vedi java e gli executor service); non è ottimale, ma devi stare ad alti numeri di carico per iniziare a preoccupartene (ed a quel punto il management risolve comprando ibm power series… ma questa è un altra storia).
              Young professional woman and busy mom.
              • Avatar
                ☺
                Scritto da
                Wakko Warner
                Wakkus Horribilis
                il 2017-04-17 17:33:38.0 alle 2017-04-17 17:33:38.0
                Trollate totali: 6779
                Re: Callbacks as our Generations' Go To Statement
                Scritto da: ::1
                > Scritto da: Wakko Warner
                > > Scritto da: avvelentani
                > > > > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.
                > > >
                > > > Le chiamate bloccanti erano ancora piu` semplici.
                > >
                > > Nessuno lo mette in dubbio, ma appunto il compito delle async-await è far ritornare il codice leggibile come quando si usavano le chiamate bloccanti senza però rinunciare ai vantaggi delle chiamate non bloccanti.
                > >
                > > Per esempio, su IIS viene riservato un certo pool di thread per gestire le richieste, facciamo finta che siano 2000 giusto per dare un numero.
                > > Questi thread vengono messi in un pool di thread inattivi pronti ad essere assegnati alle varie richieste in ingresso.
                > >
                > > Ora immagina di avere nel tuo codice una chiamata bloccante per, chessò, fare una certa operazione su un grosso numero di righe in un database che impiega 10 secondi per eseguirsi. Questo significa che per 10 secondi interi quel thread è mantenuto occupato inutilmente in attesa di una risposta mentre il database (che è un processo esterno) fa quello che deve fare.
                > >
                > > Immagina ora che questo sito sia un grosso sito, utilizzato da migliaia di persone ogni secondo... e che molti di loro debbano fare operazioni simili sui dati. Arriverai al punto in cui molti di questi thread sono bloccati e il server web, raggiunti i 2000 thread occupati, non potrà fare altro che dare errore all'utente che sta cercando di avviare una nuova richiesta perché non ci sono thread disponibili a servirlo.
                > >
                > > Con le async-await questo problema non succede perché il thread non resta occupato ad aspettare una risposta, quello che stava facendo quel thread viene momentaneamente sospeso in attesa di una risposta dal database e il thread viene rimesso nel pool dei thread disponibili per accettare nuove connessioni. Quindi ora non stai sprecando risorse inutilmente in attesa di qualcosa su cui non hai alcun controllo.
                > >
                > > Ho fatto l'esempio del database ma potrebbe essere qualunque cosa... l'accesso ad un file sul filesystem, la chiamata di una API su un server di terze parti, ecc.
                > >
                > > Il punto è che le chiamate bloccanti sono più semplici, ma in alcuni casi non ce le possiamo permettere. Invece di usare callback incomprensibili si usano gli async-await e noi sviluppatori siamo felici perché capiamo quello che stiamo facendo e pure il cliente è felice perché il software funziona meglio.
                >
                > A me async/await non piace come sintassi, perché nasconde al programmatore il fatto che il metodo viene spezzato.

                E perché ti importa? È una cosa di cui si occupa il compilatore, non devi occupartene tu. Ti poni tutti questi problemi anche circa come il compilatore compila il tuo codice in assembly? Non credo... dai per scontato che lo faccia correttamente... non vai certo a verificare se ha azzerato la tua variabile con un assegnamento o uno xor con se stesso.

                Metti ora sul piatto i vantaggi che async/await ti danno, in primis la facilità di ragionare sul codice, di capirlo, mantenerlo, ecc.

                IMO più è la macchina ad occuparsi dei dettagli e più sono sicuro che il codice faccia esattamente quello che voglio faccia, meno codice scrivo e più sono sicuro di non aver introdotto bug, più facile il codice è da leggere e meno mi fa diventare matto e fa perdere tempo. Al cliente non glie ne frega nulla di come hai raggiunto il risultato, a lui interessa che il risultato sia quello che si aspettava, che abbia meno bug possibili ed ottenerlo nel più breve tempo possibile.

                Se io e te facciamo lo stesso software ma tu impieghi 1 mese e 3000 euro in più di me per farglielo, da chi credi lo comprerà? Alla fine a te sviluppatore interessa guadagnare con meno sforzo possibile (che è poi quello che interessa tutti) e il tuo cliente avere quello che ha chiesto il prima possibile pagandolo il meno possibile.

                Non so te, ma io do un alto valore al mio tempo e preferisco avere più tempo libero possibile. Impiegare il mio tempo decifrando quello che succede in mille mila callback annidiate non è il modo in cui preferisco passare il mio tempo né tantomeno mi piace stare a spaccarmi la testa su problemi che si possono evitare interamente.

                > Il problema degli stacktrace in codice non-blocking si risolve solo parcheggiando il vecchio stack da qualche parte, ma non è una cosa gratuita, e la soluzione microsoftara è l'unica percorribile (mi dici quanti stack frames ti servono e te li tengo).

                Non è gratuito, ma non ti importa, è un lavoro che fa il tuo strumento di sviluppo in fase di debug e ti rende più semplice la vita. Perché lamentarsene?

                > Il codice blocking tuttavia non è così drammatico come lo disegni, un'architettura classica con un webserver con i/o asincrono e backend con i/o sincrono funziona bene anche con grandi carichi, soprattutto se il backend ha threadpool dinamici (vedi java e gli executor service); non è ottimale, ma devi stare ad alti numeri di carico per iniziare a preoccupartene (ed a quel punto il management risolve comprando ibm power series… ma questa è un altra storia).

                Hai mai provato a sviluppare qualcosa per android? Magari con phonegap dove ogni 3 righe hai una callback? Lì semplicemente non puoi evitarle perché è l'ambiente stesso che non ti offre alternative sincrone. Io l'ho fatto, ed è un'esperienza che preferirei non ripetere. Con i Future le cose un po'si semplificano, ma sono comunque lontane anni luce dalla semplicità dell'await/async.
                Gli Svizzeri non sono tutti ricchi - Mattia
                • Avatar
                  ☺
                  Scritto da
                  avvelentani
                  Cubicolario
                  il 2017-04-17 17:50:30.0 alle 2017-04-17 17:50:30.0
                  Trollate totali: 18184
                  Re: Callbacks as our Generations' Go To Statement
                  Scritto da: Wakko Warner
                  >
                  > E perché ti importa? È una cosa di cui si occupa il compilatore, non devi occupartene tu. Ti poni tutti questi problemi anche circa come il compilatore compila il tuo codice in assembly?

                  Ma se ti devi far compilare il codice in un modo strano perche' non farselo compilare tutto strano come fa go? Async/await mi sembra un po' una mezza misura del cazzo.

                  > Hai mai provato a sviluppare qualcosa per android? Magari con phonegap dove ogni 3 righe hai una callback? Lì semplicemente non puoi evitarle perché è l'ambiente stesso che non ti offre alternative sincrone.

                  Il problema li` e` l'API fatta male.
                  I think happiness is love
                  - Vladimir Putin
                • Avatar
                  ☺
                  Scritto da
                  ::1
                  il 2017-04-17 18:02:53.0 alle 2017-04-17 18:02:53.0
                  Trollate totali: 12321
                  Re: Callbacks as our Generations' Go To Statement
                  Scritto da: Wakko Warner
                  > Scritto da: ::1
                  > > Scritto da: Wakko Warner
                  > > > Scritto da: avvelentani
                  > > > > > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.
                  > > > >
                  > > > > Le chiamate bloccanti erano ancora piu` semplici.
                  > > >
                  > > > Nessuno lo mette in dubbio, ma appunto il compito delle async-await è far ritornare il codice leggibile come quando si usavano le chiamate bloccanti senza però rinunciare ai vantaggi delle chiamate non bloccanti.
                  > > >
                  > > > Per esempio, su IIS viene riservato un certo pool di thread per gestire le richieste, facciamo finta che siano 2000 giusto per dare un numero.
                  > > > Questi thread vengono messi in un pool di thread inattivi pronti ad essere assegnati alle varie richieste in ingresso.
                  > > >
                  > > > Ora immagina di avere nel tuo codice una chiamata bloccante per, chessò, fare una certa operazione su un grosso numero di righe in un database che impiega 10 secondi per eseguirsi. Questo significa che per 10 secondi interi quel thread è mantenuto occupato inutilmente in attesa di una risposta mentre il database (che è un processo esterno) fa quello che deve fare.
                  > > >
                  > > > Immagina ora che questo sito sia un grosso sito, utilizzato da migliaia di persone ogni secondo... e che molti di loro debbano fare operazioni simili sui dati. Arriverai al punto in cui molti di questi thread sono bloccati e il server web, raggiunti i 2000 thread occupati, non potrà fare altro che dare errore all'utente che sta cercando di avviare una nuova richiesta perché non ci sono thread disponibili a servirlo.
                  > > >
                  > > > Con le async-await questo problema non succede perché il thread non resta occupato ad aspettare una risposta, quello che stava facendo quel thread viene momentaneamente sospeso in attesa di una risposta dal database e il thread viene rimesso nel pool dei thread disponibili per accettare nuove connessioni. Quindi ora non stai sprecando risorse inutilmente in attesa di qualcosa su cui non hai alcun controllo.
                  > > >
                  > > > Ho fatto l'esempio del database ma potrebbe essere qualunque cosa... l'accesso ad un file sul filesystem, la chiamata di una API su un server di terze parti, ecc.
                  > > >
                  > > > Il punto è che le chiamate bloccanti sono più semplici, ma in alcuni casi non ce le possiamo permettere. Invece di usare callback incomprensibili si usano gli async-await e noi sviluppatori siamo felici perché capiamo quello che stiamo facendo e pure il cliente è felice perché il software funziona meglio.
                  > >
                  > > A me async/await non piace come sintassi, perché nasconde al programmatore il fatto che il metodo viene spezzato.
                  >
                  > E perché ti importa? È una cosa di cui si occupa il compilatore, non devi occupartene tu. Ti poni tutti questi problemi anche circa come il compilatore compila il tuo codice in assembly? Non credo... dai per scontato che lo faccia correttamente... non vai certo a verificare se ha azzerato la tua variabile con un assegnamento o uno xor con se stesso.
                  >
                  > Metti ora sul piatto i vantaggi che async/await ti danno, in primis la facilità di ragionare sul codice, di capirlo, mantenerlo, ecc.
                  >
                  > IMO più è la macchina ad occuparsi dei dettagli e più sono sicuro che il codice faccia esattamente quello che voglio faccia, meno codice scrivo e più sono sicuro di non aver introdotto bug, più facile il codice è da leggere e meno mi fa diventare matto e fa perdere tempo. Al cliente non glie ne frega nulla di come hai raggiunto il risultato, a lui interessa che il risultato sia quello che si aspettava, che abbia meno bug possibili ed ottenerlo nel più breve tempo possibile.
                  >
                  > Se io e te facciamo lo stesso software ma tu impieghi 1 mese e 3000 euro in più di me per farglielo, da chi credi lo comprerà? Alla fine a te sviluppatore interessa guadagnare con meno sforzo possibile (che è poi quello che interessa tutti) e il tuo cliente avere quello che ha chiesto il prima possibile pagandolo il meno possibile.
                  >
                  > Non so te, ma io do un alto valore al mio tempo e preferisco avere più tempo libero possibile. Impiegare il mio tempo decifrando quello che succede in mille mila callback annidiate non è il modo in cui preferisco passare il mio tempo né tantomeno mi piace stare a spaccarmi la testa su problemi che si possono evitare interamente.
                  >
                  > > Il problema degli stacktrace in codice non-blocking si risolve solo parcheggiando il vecchio stack da qualche parte, ma non è una cosa gratuita, e la soluzione microsoftara è l'unica percorribile (mi dici quanti stack frames ti servono e te li tengo).
                  >
                  > Non è gratuito, ma non ti importa, è un lavoro che fa il tuo strumento di sviluppo in fase di debug e ti rende più semplice la vita. Perché lamentarsene?

                  Il codice non devi solo scriverlo, ma anche mantenerlo; significa anche leggere uno stralcio di log tra 5-10 anni e capire cosa fa e seguire il percorso nel codice. Uno stacktrace interrotto o parziale è la cosa peggiore che ti può capitare se non hai modo di ricostruire da dove è partita l'invocazione, ed in release ms lo limita perché ha un costo. Il mio lavoro implica spesso leggere stacktrace di codice scritto da altri e capire cosa fare per fixare.

                  > > Il codice blocking tuttavia non è così drammatico come lo disegni, un'architettura classica con un webserver con i/o asincrono e backend con i/o sincrono funziona bene anche con grandi carichi, soprattutto se il backend ha threadpool dinamici (vedi java e gli executor service); non è ottimale, ma devi stare ad alti numeri di carico per iniziare a preoccupartene (ed a quel punto il management risolve comprando ibm power series… ma questa è un altra storia).
                  >
                  > Hai mai provato a sviluppare qualcosa per android? Magari con phonegap dove ogni 3 righe hai una callback? Lì semplicemente non puoi evitarle perché è l'ambiente stesso che non ti offre alternative sincrone. Io l'ho fatto, ed è un'esperienza che preferirei non ripetere. Con i Future le cose un po'si semplificano, ma sono comunque lontane anni luce dalla semplicità dell'await/async.

                  Ho scritto parecchia roba su nodejs, e senza usare framework esterni l'unica via efficace che ho riscontrato è quella di evitare callback anonime nel codice, portarle fuori e dare un nome alla funzione ed ai parametri.
                  Young professional woman and busy mom.
              • Avatar
                ☺
                Scritto da
                altg
                utente che non utiene
                il 2017-04-17 18:06:42.0 alle 2017-04-17 18:06:42.0
                Trollate totali: 11540
                Re: Callbacks as our Generations' Go To Statement
                > Il codice blocking tuttavia non è così drammatico come lo disegni, un'architettura classica con un webserver con i/o asincrono e backend con i/o sincrono funziona bene anche con grandi carichi, soprattutto se il backend ha threadpool dinamici (vedi java e gli executor service); non è ottimale, ma devi stare ad alti numeri di carico per iniziare a preoccupartene (ed a quel punto il management risolve comprando ibm power series… ma questa è un altra storia).

                quindi invece di inventarsi qualcosa per far apparire sincrona un'operazione asincrona, si potrebbe risolvere mantenendo tutto sincrono ma diffuso a un florilegio di worker threads? agli scrittori di compilatori semplificherebbe la vita...

                ...pero` nel mio caso ci sarebbe anche un florilegio di stacks, e io per ora avevo reso le cose confortevoli allocando 4 MB di stack per thread. Poi crei 100 threads e ti vengono 400 MB di solo stack per tutta l'applicazione. Un po' un po' un po' sprecato, forse. Un po'. Pero` comodo, eh? Anonimo
              • Avatar
                Scritto da
                Non Autenticato
                il 2017-04-17 21:09:12.0 alle 2017-04-17 21:09:12.0
                Re: Callbacks as our Generations' Go To Statement
                Scritto da: ::1
                > Scritto da: Wakko Warner
                > > Scritto da: avvelentani
                > > > > Il punto degli async-await è quello di permetterti di scrivere codice più chiaro e comprensibile.
                > > >
                > > > Le chiamate bloccanti erano ancora piu` semplici.
                > >
                > > Nessuno lo mette in dubbio, ma appunto il compito delle async-await è far ritornare il codice leggibile come quando si usavano le chiamate bloccanti senza però rinunciare ai vantaggi delle chiamate non bloccanti.
                > >
                > > Per esempio, su IIS viene riservato un certo pool di thread per gestire le richieste, facciamo finta che siano 2000 giusto per dare un numero.
                > > Questi thread vengono messi in un pool di thread inattivi pronti ad essere assegnati alle varie richieste in ingresso.
                > >
                > > Ora immagina di avere nel tuo codice una chiamata bloccante per, chessò, fare una certa operazione su un grosso numero di righe in un database che impiega 10 secondi per eseguirsi. Questo significa che per 10 secondi interi quel thread è mantenuto occupato inutilmente in attesa di una risposta mentre il database (che è un processo esterno) fa quello che deve fare.
                > >
                > > Immagina ora che questo sito sia un grosso sito, utilizzato da migliaia di persone ogni secondo... e che molti di loro debbano fare operazioni simili sui dati. Arriverai al punto in cui molti di questi thread sono bloccati e il server web, raggiunti i 2000 thread occupati, non potrà fare altro che dare errore all'utente che sta cercando di avviare una nuova richiesta perché non ci sono thread disponibili a servirlo.
                > >
                > > Con le async-await questo problema non succede perché il thread non resta occupato ad aspettare una risposta, quello che stava facendo quel thread viene momentaneamente sospeso in attesa di una risposta dal database e il thread viene rimesso nel pool dei thread disponibili per accettare nuove connessioni. Quindi ora non stai sprecando risorse inutilmente in attesa di qualcosa su cui non hai alcun controllo.
                > >
                > > Ho fatto l'esempio del database ma potrebbe essere qualunque cosa... l'accesso ad un file sul filesystem, la chiamata di una API su un server di terze parti, ecc.
                > >
                > > Il punto è che le chiamate bloccanti sono più semplici, ma in alcuni casi non ce le possiamo permettere. Invece di usare callback incomprensibili si usano gli async-await e noi sviluppatori siamo felici perché capiamo quello che stiamo facendo e pure il cliente è felice perché il software funziona meglio.
                >
                > A me async/await non piace come sintassi, perché nasconde al programmatore il fatto che il metodo viene spezzato.
                > Il problema degli stacktrace in codice non-blocking si risolve solo parcheggiando il vecchio stack da qualche parte, ma non è una cosa gratuita, e la soluzione microsoftara è l'unica percorribile (mi dici quanti stack frames ti servono e te li tengo).
                > Il codice blocking tuttavia non è così drammatico come lo disegni, un'architettura classica con un webserver con i/o asincrono e backend con i/o sincrono funziona bene anche con grandi carichi, soprattutto se il backend ha threadpool dinamici (vedi java e gli executor service); non è ottimale, ma devi stare ad alti numeri di carico per iniziare a preoccupartene (ed a quel punto il management risolve comprando ibm power series… ma questa è un altra storia).

                Non capisco una mazza di questo thread, ma sono contento che ci sia.
<softv>

Pagina generata in 151 millisecondi

Utenti attivi: 9 nell'ultimo minuto, 28 negli ultimi cinque minuti, 50 negli ultimi 15 minuti