Asincrono vs Multithreading – C’è una differenza?

Una chiamata asincrona crea sempre un nuovo thread? Qual è la differenza tra i due?

Una chiamata asincrona crea sempre o usa un nuovo thread?

Wikipedia dice :

Nella programmazione per computer, eventi asincroni sono quelli che si verificano indipendentemente dal stream del programma principale. Le azioni asincrone sono azioni eseguite in uno schema non bloccante, consentendo al stream del programma principale di continuare l’elaborazione.

So che le chiamate asincrone possono essere fatte su singoli thread? Com’è ansible?

Questa domanda è davvero troppo generica per rispondere.

Nel caso generale, una chiamata asincrona non crea necessariamente un nuovo thread. Questo è un modo per implementarlo, con un pool di thread preesistente o un processo esterno che sono altri modi. Dipende molto dalla lingua, dal modello object (se esiste) e dall’ambiente di esecuzione.

Asincrono significa semplicemente che il thread chiamante non si siede e attende la risposta, né l’attività asincrona si verifica nel thread chiamante.

Oltre a questo, avrai bisogno di essere più specifico.

Ogni volta che l’operazione che deve avvenire in modo asincrono non richiede che la CPU lavori, questa operazione può essere eseguita senza generare altro thread. Ad esempio, se l’operazione asincrona è I / O, la CPU non deve attendere il completamento dell’I / O. Ha solo bisogno di iniziare l’operazione, e può quindi passare ad altri lavori mentre l’I / O hardware (controller del disco, interfaccia di rete, ecc.) Esegue l’I / O. L’hardware consente alla CPU di sapere quando ha finito interrompendo la CPU e il sistema operativo invia l’evento alla tua applicazione.

Spesso le astrazioni e le API di livello superiore non espongono le API asincrone sottostanti disponibili dal sistema operativo e dall’hardware sottostante. In questi casi, in genere è più semplice creare thread per eseguire operazioni asincrone, anche se il thread generato è in attesa di un’operazione di I / O.

Se l’operazione asincrona richiede che la CPU lavori, in genere quell’operazione deve avvenire in un altro thread perché sia ​​veramente asincrona. Anche allora, sarà davvero solo asincrono se c’è più di una unità di esecuzione.

No, le chiamate asincrone non implicano sempre thread.

Solitamente avviano una sorta di operazione che continua in parallelo con il chiamante. Ma quell’operazione potrebbe essere gestita da un altro processo, dal sistema operativo, da altro hardware (come un controller del disco), da qualche altro computer sulla rete o da un essere umano. I thread non sono l’unico modo per fare le cose in parallelo.

Il multithreading fa riferimento a più operazioni che si verificano nello stesso processo. Mentre la programmazione asincrona si diffonde attraverso i processi. Ad esempio, se le mie operazioni richiedono un servizio web, il thread non deve attendere fino al ritorno del servizio web. Qui usiamo la programmazione asincrona che consente al thread di non attendere il completamento di un processo in un’altra macchina. E quando inizia a ricevere una risposta dal webservice, può interrompere il thread principale per dire che il servizio web ha completato l’elaborazione della richiesta. Ora il thread principale può elaborare il risultato.

JavaScript è single-threaded e asincrono. Quando si utilizza XmlHttpRequest, ad esempio, si fornisce una funzione di callback che verrà eseguita in modo asincrono al termine della risposta.

John Resig ha una buona spiegazione del problema correlato di come funzionano i timer in JavaScript .

Windows ha sempre avuto un’elaborazione asincrona dai tempi non preventivi (versioni 2.13, 3.0, 3.1, ecc.) Utilizzando il ciclo dei messaggi, molto prima di supportare i thread reali. Quindi, per rispondere alla tua domanda, no, non è necessario creare un thread per eseguire l’elaborazione asincrona.

Non è nemmeno necessario che le chiamate asincrone si verifichino sullo stesso sistema / dispositivo di quello che ha invocato la chiamata. Quindi se la domanda è, una chiamata asincrona richiede un thread nel processo corrente, la risposta è no. Tuttavia, deve esistere un thread di esecuzione da qualche parte per l’elaborazione della richiesta asincrona.

Filo di esecuzione è un termine vago. In un sistema collaborativo come i primi sistemi operativi Macintosh e Windows, il thread di esecuzione potrebbe essere semplicemente lo stesso processo che ha fatto in modo che la richiesta eseguisse un altro stack, puntatore di istruzioni, ecc … Tuttavia, quando le persone parlano generalmente di chiamate asincrone , in genere indicano chiamate gestite da un altro thread se è intra-processo (cioè all’interno dello stesso processo) o da un altro processo se è inter-processo.

Si noti che la comunicazione tra processi (o interprocesso) (IPC) è comunemente generalizzata per includere la comunicazione intra-processo, poiché le tecniche per il blocco e la sincronizzazione dei dati sono solitamente le stesse indipendentemente dal processo in cui i thread di esecuzione separati vengono eseguiti.

Alcuni sistemi consentono di sfruttare la concorrenza nel kernel per alcune strutture che utilizzano i callback. Per un’istanza alquanto oscura, sono stati utilizzati richiami di I / O asincroni per implementare i sever di Internet non bloccanti nei giorni multitasking senza preclusioni di Mac System 6-8.

In questo modo hai flussi di esecuzione simultanei “in” programmi senza thread in quanto tali .

Asincrono significa semplicemente che non si blocca il programma in attesa di qualcosa (chiamata di funzione, dispositivo, ecc.) Per finire. Può essere implementato in un thread separato, ma è anche comune utilizzare un thread dedicato per attività sincrone e comunicare tramite un qualche tipo di sistema di eventi e ottenere così un comportamento asincrono.

Esistono esempi di programmi asincroni a thread singolo. Qualcosa di simile a:

...do something ...send some async request while (not done) ...do something else ...do async check for results 

La natura delle chiamate asincrone è tale che, se si desidera che l’applicazione continui a essere eseguita mentre è in corso la chiamata, sarà necessario generare un nuovo thread o almeno utilizzare un altro thread che si è creato al solo scopo di gestione di callback asincroni.

A volte, a seconda della situazione, è ansible che si desideri invocare un metodo asincrono, ma farlo apparire all’utente come sincrono (ovvero bloccare fino a quando il metodo asincrono ha segnalato che è completo). Questo può essere ottenuto tramite API Win32 come WaitForSingleObject .

Un’operazione asincrona è un’operazione che continua in background dopo essere stata avviata, senza costringere il chiamante ad attendere che termini prima di eseguire altro codice.

Invece di bloccare il programma chiamante (o il thread) fino a quando arriva una risposta, un’implementazione asincrona (detta anche non bloccante) invierà una richiesta al database o al servizio web o altro, quindi ritornerà immediatamente, lasciando che il programma continui a eseguire altro codice mentre il servizio remoto invia una risposta. Una volta che la risposta arriva, il sistema eseguirà un callback (sul loop dei messaggi o in un thread della porta di completamento dell’IO separato, a seconda dell’ambiente), lasciando che il codice gestisca la risposta.

Multi-threading significa eseguire più di un thread di esecuzione alla volta. In questo modello, tutte le operazioni sono ancora sincrone, ma la CPU eseguirà contemporaneamente più thread di operazioni sincrone.

Il multithreading ha più senso quando si chiamano operazioni multiple (e indipendenti) collegate alla CPU, su un processore multi-core. Ad esempio, un programma che analizza in modo indipendente ogni pixel in un’immagine potrebbe dividere l’immagine in una striscia per ogni core della CPU, quindi analizzare ciascuna striscia nel proprio thread allo stesso tempo.

Leggi di più qui – https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/