Non credo di chiamarlo barare. La principale, fondamentale differenza tra più thread e più processi è che più thread condividono un singolo spazio di indirizzamento. In quanto tale, la definizione di più thread (anziché di più processi) mi sembra un tacito permesso di sfruttare lo spazio di indirizzamento condiviso (almeno in assenza di una definizione molto specifica di "passing" che lo proibiva).
Ciò che viene in mente è questo: Erlang in realtà non ha thread, in quanto tale - ha processi con comunicazioni asincrone. I processi sono (intenzionalmente) isolati l'uno dall'altro in larga misura. Da un lato, questo rende lo sviluppo molto più facile - in particolare, un processo può influenzare solo un altro tramite canali di comunicazione specifici e ben definiti. Sotto il cofano, utilizza molti trucchi (quasi certamente includendo la memoria condivisa) per ottimizzare i suoi processi e trarre vantaggio da ciò che è possibile in una specifica implementazione/situazione (come tutti i processi in esecuzione in un unico spazio di indirizzamento condiviso). Ciò nonostante, il fatto di dover mantenere nascosti tutti i trucchi impedisce di essere altrettanto efficiente di qualcosa come la versione C in cui i "trucchi" sono tutti espliciti e completamente esposti.
Vorrei usare un'analogia della vita reale per spiegare la differenza. Pensa ai thread/processi come persone.Erlang impone un rapporto professionale di lavoro in cui le comunicazioni sono tutte accuratamente registrate nei memo. Le versioni C e C++ sono più simili a un marito e una moglie che potrebbero comunicare con una singola parola che non significa nulla per nessuno, o anche solo una rapida occhiata.
Quest'ultimo è estremamente efficiente quando funziona, ma è molto più aperto a sottili incomprensioni, e se i due litigano probabilmente non vorrai essere nella stessa stanza. Per il manager, le persone in relazioni puramente professionali sono molto più facili da gestire anche se la loro massima efficienza non è abbastanza alta.
fonte
2010-08-20 16:06:10
Alcuni di questi confronti sono quelli di mele e arance. La ragione di questo è che se vuoi solo che le cose vadano in giro molto velocemente, allora puoi farlo molto più velocemente in C e C++. Il punto IMHO è che Erlang gestisce molto di più che semplicemente "inviando un token tra processi" (si tratta di processi che non sono thread;)). Ho scritto un articolo su alcune delle differenze un po 'di tempo fa; vale la pena di verificare: http://forum.trapexit.org/viewtopic.php?t=15194 e http://www.trapexit.org/Process_Ring_Across_Nodes –
Questo è un buon esempio e la definizione che stai dando è qualcosa che mi aspetterei da tutte le soluzioni. Qualcuno ha provato a riscriverlo in un'altra lingua, a qualche risultato? Inoltre, puoi pensare ad un benchmark single-node in cui Erlang potrebbe eccellere in termini di velocità? –
Il punto che Joe Armstrong stava facendo era semplicemente "Il passaggio dei messaggi tra i processi dormienti in Erlang è molto veloce ... Java è da 5 a 10 volte più lento." (I programmatori Java hanno ridotto tale differenza.) [Misurazioni delle prestazioni dei thread in Java e nei processi in Erlang 1998-11-02] – igouy