Domanda

Ho notato due metodi per "message passing". Uno che ho visto l'uso Erlang e l'altro è da Stackless Python. Da quello che ho capito qui è la differenza

Erlang Style - I messaggi vengono inviati e in coda nella cassetta postale del processo di ricezione. Da lì vengono rimossi in una base FIFO. Una volta che il primo processo invia il messaggio è libero di continuare.

Python Style - Processo A code per inviare per elaborare B. B sta eseguendo qualche altra azione, in modo da A è congelato fino a quando B è pronto a ricevere. Una volta che B si apre un canale di lettura, A invia i dati, poi entrambi continuano.

Ora vedo i pro del metodo Erlang è che non si dispone di alcun processo bloccati. Se B non è in grado di ricevere, A può ancora continuare. Tuttavia ho notato in alcuni programmi che ho scritto, che è possibile per le finestre di messaggio Erlang per ottenere pieno di centinaia (o migliaia) di messaggi dal momento che l'afflusso di messaggi è maggiore il deflusso.

Ora non ho scritto un programma di grandi dimensioni sia in quadro / lingua Quindi mi chiedo le vostre esperienze sono con questo, e se si tratta di qualcosa che dovrebbe anche preoccuparsi.

Sì, so che questo è astratto, ma sto anche cercando risposte piuttosto astratti.

È stato utile?

Soluzione

La mia esperienza nella programmazione Erlang è che quando ci si aspetta un tasso di messaggistica elevato (vale a dire, un produttore più veloce rispetto al consumo) allora si aggiungere il proprio controllo di flusso. Un semplice scenario

  • Il consumatore sarà: inviare il messaggio, attendere ACK, quindi ripetere.
  • Il produttore: attendere il messaggio, inviare ack quando il messaggio ricevuto ed elaborato, quindi ripetere
  • .

Si può anche invertire esso, le attese dei produttori per il consumatore a venire e prendere il N prossimi messaggi disponibili.

Questi approcci e altri controllo di flusso possono essere nascosti dietro le funzioni, il primo è in gran parte già disponibili in gen_server:call/2,3 contro un processo di comportamento OTP gen_server.

Vedo messaggistica asincrona come in Erlang come l'approccio migliore, dal momento in cui le latenze sono elevati si potrebbe molto vuole evitare una sincronizzazione quando messaging tra computer. Si può allora comporre modi intelligenti per implementare il controllo di flusso. Dire, che richiede un ACK dal consumatore per ogni N messaggi il produttore hanno inviato, o inviare un messaggio speciale "me ping se è stato ricevuto questo uno" di tanto in tanto, il conteggio del tempo di ping.

Altri suggerimenti

In generale, questo è code illimitate vs code delimitate. Un canale stackless può essere considerato un caso particolare di una coda con 0 dimensioni.

code delimitate hanno la tendenza a un punto morto. Due fili / processi cercando di inviare un messaggio a vicenda, entrambi con una coda piena.

code illimitate hanno più sottile fallimento. Una grande cassetta postale non soddisferà i requisiti di latenza, come lei ha ricordato. Va abbastanza lontano e sarà alla fine di troppo pieno; esiste una cosa come la memoria infinita, quindi è davvero solo una coda limitata con un limite enorme che interrompe il processo quando è piena.

Che è meglio? Questo è difficile da dire. C'è risposte facili qui.

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