Quando sono non leggibili le operazioni di lettura o ricezione non utili?

0

Indipendentemente dalla libreria, dalla lingua o dalle specifiche, le operazioni di invio / scrittura asincrone hanno senso per me, poiché il codice più avanti nel percorso di esecuzione potrebbe non avere alcuna dipendenza dal successo o dall'errore dell'operazione di scrittura.

Tuttavia, le operazioni di ricezione / lettura asincrone non sono motivate per me.

Qualcuno può suggerire situazioni specifiche o schemi generali in cui è utile la ricezione dei messaggi asincroni?

Contesto

La mia domanda è richiesta dalle specifiche MPI, ma più generale è la risposta, meglio è. Nello specifico, ci sono blocchi di chiamate per comunicare tra processi o macchine:

MPI_Send(...) MPI_Recv(...)

e ci sono analoghe chiamate non bloccanti che accettano un parametro aggiuntivo MPI_Request * per gestire le operazioni di invio / ricezione in modo asincrono:

MPI_Isend(..., &request) MPI_Irecv(..., &request)

    
posta kdbanman 09.03.2015 - 16:47
fonte

2 risposte

2

Il motivo principale della lettura asincrona è utile se hai ancora altro lavoro da fare o più spesso perché c'è un'altra fonte di input che devi anche ascoltare.

Ad esempio una GUI è necessario ascoltare l'input dell'utente oltre a ottenere l'immagine dal disco.

Senza I / O asincroni dovresti iniziare un nuovo thread ogni volta che inizi a leggere qualcosa con un'API di blocco. Questo non scalerà bene.

I server possono avere più connessioni attive alla volta, specialmente quando comunica anche con un database e un server di file.

    
risposta data 10.03.2015 - 08:03
fonte
0

Le letture non bloccanti possono essere particolarmente utili in contesti in cui i dati possono o non possono arrivare, ma se i dati arrivano dovrebbe influenzare il comportamento di un'azione che viene eseguita. Ad esempio, se un programma interattivo che comunica via TCP si aspetta di eseguire alcuni calcoli in risposta a una richiesta, ma è possibile che il client possa scoprire - prima che i calcoli siano completi - che non sarà più interessato ai risultati, l'applicazione potrebbe trarre beneficio dall'uso di una lettura non bloccante che cerca un segnale di "interruzione". Richiedere al client di inviare messaggi continui "sì, sono ancora interessato" potrebbe essere fastidioso, specialmente se il cliente non ha idea di quanto tempo ci vorrà per il calcolo.

Nei casi in cui si desideri eseguire diverse operazioni di I / O in modo indipendente ma si prevede che vengano eseguite fino al completamento, è spesso più semplice e più pulito utilizzare più thread rispetto all'utilizzo dell'I / O asincrono. Nei casi in cui l'intero scopo di I / O sarebbe quello di influenzare un processo che è in esecuzione su un altro thread, tuttavia, creare un thread aggiuntivo solo per sedersi sul socket sarebbe inutile e poco elegante.

    
risposta data 10.03.2015 - 18:03
fonte

Leggi altre domande sui tag