Non capisco perfettamente il determinismo nel contesto della concorrenza e del parallelismo in Haskell. Alcuni esempi potrebbero essere utili. GraziePerché haskell concomitante non deterministico mentre primitive haskell parallele (par e pseq) deterministiche?
risposta
Quando si tratta di valori puri, l'ordine di valutazione non ha importanza. Questo è essenzialmente il parallelismo : Valutazione di valori puri in parallelo. Al contrario dei valori puri, l'ordine di solito è importante per le azioni con effetti collaterali. L'esecuzione simultanea delle azioni è denominata simultanea.
Ad esempio, considerare le due azioni putStr "foo"
e putStr "bar"
. A seconda dell'ordine in cui vengono valutate queste due azioni, l'output è "foobar", "barfoo" o qualsiasi stato intermedio. L'output è indeterministico in quanto dipende dall'ordine specifico di valutazione.
Come altro esempio, considerare i due valori sum [1..10]
e 5 * 3
. Indipendentemente dall'ordine in cui questi due vengono valutati, si riducono sempre agli stessi risultati. Questo determinismo è qualcosa che solitamente si può garantire solo con valori puri.
Concorrenza e parallelismo sono due cose diverse.
Concorrenza significa che più thread interagiscono in modo non deterministico. Ad esempio, potresti avere un server di chat in cui ogni client viene gestito da un thread. Il non-determinismo è essenziale per il sistema che stai cercando di modellare.
Il parallelismo riguarda l'utilizzo di più thread per semplificare l'esecuzione del programma. Tuttavia, il risultato finale dovrebbe essere esattamente lo stesso di se si esegue l'algoritmo in sequenza.
Molte lingue non hanno primitive per il parallelismo, quindi è necessario implementarlo utilizzando le primitive della concorrenza come i thread e i blocchi. Tuttavia, ciò significa che il programmatore deve fare attenzione a non introdurre accidentalmente non determinismo indesiderato o altri problemi di concorrenza. Con primitive del parallelismo esplicito come par
e pseq
, molte di queste preoccupazioni vanno semplicemente via.
Questa è ... una * veramente * buona spiegazione. Grazie. –
- 1. riguardo 'pseq' in Haskell
- 2. Perché abbiamo bisogno di "seq" o "pseq" con "par" in Haskell?
- 3. Haskell: Perché "par" è stato definito così com'era?
- 4. Prestazioni di calcolo elenco parallelo Haskell
- 5. Concorrenza di Haskell - forkIO è davvero non deterministico?
- 6. Haskell - pattern matching non esaustivo in Haskell
- 7. Rallentamento quando si utilizzano strategie parallele in Haskell
- 8. Perché questo codice Haskell non termina?
- 9. Haskell: Non compreso: foldl '?
- 10. Haskell (:) e (++) differenze
- 11. Haskell parMap e parallelismo
- 12. Perché questo filtro Haskell termina?
- 13. Valutazione Haskell e Lazy Monads
- 14. Perché Haskell è così grande?
- 15. Haskell simultaneità e persistenza
- 16. Calcolo parallelo in Haskell
- 17. Haskell Servant e streaming
- 18. Haskell
- 19. Haskell: modelli non esaustivi
- 20. Haskell scartare una scintilla quando il thunk viene raccolto?
- 21. Perché l'ordinamento dei dizionari non è deterministico?
- 22. Haskell e stato
- 23. Haskell e numeri casuali
- 24. Creazione di profili con prestazioni di multithreading in un programma Haskell - nessuna accelerazione utilizzando strategie parallele
- 25. Principiante Haskell
- 26. Haskell - Funtori
- 27. ricorsione primitiva modulo haskell
- 28. Haskell: funzioni duplicate (+) e (++), mappend
- 29. applicazione Haskell funzione e strigliare
- 30. Perché questo codice opencl non è deterministico?
+1; in altre parole, il parallelismo è un'ottimizzazione; la semantica cambia la concorrenza. – ehird
@ehird Sì. Questo è perfettamente quello che ho cercato di trasmettere. – fuz
In lang oz: 1 valore di flusso di dati può essere associato solo una volta 2 il valore di utilizzo del programma di utilizzo dovrebbe essere in attesa finché non è stato associato. Quindi il comportamento è deterministico quando due thread utilizzano uno stesso valore di flusso di dati. – jiamo