Domanda

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

Una chiamata asincrona crea o usa sempre un nuovo thread?

Wikipedia afferma :

  

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

So che le chiamate asincrone possono essere fatte su thread singoli? Come è possibile?

È stato utile?

Soluzione

Questa domanda è quasi 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 in altri modi. Dipende fortemente dal linguaggio, dal modello di oggetti (se presente) e dall'ambiente di runtime.

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

Oltre a ciò, dovrai essere più specifico.

Altri suggerimenti

Ogni volta che l'operazione che deve avvenire in modo asincrono non richiede che la CPU funzioni, tale operazione può essere eseguita senza generare un altro thread. Ad esempio, se l'operazione asincrona è I / O, la CPU non deve attendere il completamento dell'I / O. Deve solo avviare l'operazione e può quindi passare ad altri lavori mentre l'hardware I / O (controller del disco, interfaccia di rete, ecc.) Fa gli I / O. L'hardware informa la CPU al termine interrompendo la CPU e il sistema operativo invia l'evento alla tua applicazione.

Astrazioni e API di livello spesso 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 funzioni, in genere tale operazione deve avvenire in un altro thread affinché sia ??veramente asincrona. Anche allora, sarà davvero asincrono solo se esiste più di un'unità di esecuzione.

No, le chiamate asincrone non coinvolgono sempre i thread.

In genere iniziano 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. Le discussioni non sono l'unico modo per fare le cose in parallelo.

Il multi threading si riferisce a più operazioni che si verificano nello stesso processo. Mentre la programmazione asincrona si diffonde attraverso i processi. Ad esempio, se le mie operazioni chiamano un servizio Web, il thread non deve attendere il 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 risposta dal servizio web 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 è a thread singolo e asincrono. Quando si utilizza XmlHttpRequest, ad esempio, viene fornita una funzione di callback che verrà eseguita in modo asincrono al ritorno della risposta.

John Resig ha una buona spiegazione del problema relativo a come i timer funzionano in JavaScript .

Windows ha sempre avuto un'elaborazione asincrona fin dai tempi non preventivi (versioni 2.13, 3.0, 3.1, ecc.) usando il ciclo di 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 richiamato la chiamata. Quindi, se la domanda è: una chiamata asincrona richiede un thread nel processo corrente, la risposta è no. Tuttavia, ci deve essere un thread di esecuzione da qualche parte che elabora la richiesta asincrona.

Il filo conduttore è un termine vago. In sistemi di tasking cooperativi come i primi sistemi operativi Macintosh e Windows, il thread di esecuzione potrebbe essere semplicemente lo stesso processo che ha reso la richiesta in esecuzione un altro stack, puntatore di istruzioni, ecc ... Tuttavia, quando le persone generalmente parlano di chiamate asincrone , in genere significano chiamate gestite da un altro thread se è all'interno del processo (ovvero all'interno dello stesso processo) o da un altro processo se è tra processi.

Nota che la comunicazione tra processi (o tra processi) (IPC) è comunemente generalizzata per includere la comunicazione tra processi, poiché le tecniche per bloccare e sincronizzare i dati sono generalmente le stesse indipendentemente da quale processo i thread separati di esecuzione eseguita.

Alcuni sistemi consentono di sfruttare la concorrenza nel kernel per alcune strutture utilizzando callback. Per un'istanza piuttosto oscura, i callback IO asincroni sono stati usati per implementare i server Internet non bloccanti nei giorni di multitasking non preventivi di Mac System 6-8.

In questo modo hai flussi di esecuzione simultanei " in " programmate senza thread come tali .

Asincrono significa solo che non blocchi il tuo programma in attesa che qualcosa (chiamata di funzione, dispositivo, ecc.) finisca. 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 quindi ottenere un comportamento simile a quello asincrono.

Esistono esempi di programmi asincroni a thread singolo. Qualcosa del tipo:

...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 la chiamata è in corso, sarà necessario spawn un nuovo thread o almeno utilizza un altro thread che hai creato al solo scopo di gestire callback asincroni.

A volte, a seconda della situazione, potresti voler invocare un metodo asincrono ma far sembrare all'utente sincrono (cioè bloccare fino a quando il metodo asincrono ha segnalato che è completo). Ciò può essere ottenuto tramite API Win32 come WaitForSingleObject .

Un'operazione asincrona è un'operazione che continua in background dopo essere stata avviata, senza forzare il chiamante ad attendere il termine prima di eseguire altri codici.

Invece di bloccare il programma chiamante (o thread) fino all'arrivo di una risposta, un'implementazione asincrona (anche chiamata non bloccante) invierà una richiesta al database o al servizio web o altro, quindi tornerà immediatamente, lasciando che il programma continui eseguendo altro codice mentre il servizio remoto invia una risposta. Una volta ricevuta la risposta, il sistema eseguirà un callback (sul loop dei messaggi o in un thread separato della porta di completamento IO, a seconda dell'ambiente), consentendo al codice di gestire 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à più thread di operazioni sincrone contemporaneamente.

Il multi-threading ha più senso quando si chiamano operazioni multiple (e indipendenti) associate alla CPU, su un processore multi-core. Ad esempio, un programma che analizza in modo indipendente ogni pixel di un'immagine potrebbe dividere l'immagine in una striscia per ciascun core della CPU, quindi analizzare ogni striscia nel proprio thread contemporaneamente.

Ulteriori informazioni qui - https: // blog. slaks.net/2014-12-23/parallelism-async-threading-explained/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top