Me gustaría saber cómo podemos implementar productor/consumidor en un lenguaje de programación funcional como Haskell? y cómo será diferente de un lenguaje Imperativo? Mi comprensión del lenguaje de programación funcional es primitivo. Cualquier ayuda será apreciada.¿Problema de productor y consumidor en Haskell?
Respuesta
A/abstracción consumidor productor utilizando hilos de preferencia y los mensajes pasados a través de un canal:
import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan
main = do
c <- newChan
cs <- getChanContents c -- a lazy stream of events from eventReader
forkIO (producer c) -- char producer
consumer cs
where
-- thread one: the event producer
producer c = forever $ do
key <- getChar
writeChan c key
-- thread two: the lazy consumer
consumer = mapM_ print . map shift
where shift c | isAlpha c = chr (ord c + 1)
| otherwise = c
que usaría un modelo similar en Erlang. Hilos para representar al consumidor y productor, y un conjunto de mensajes compartidos entre ellos, cada uno actuando de forma asincrónica.
Esta respuesta describe cómo uno podría resolver este problema imperativamente. O más precisamente, cómo generar funcionalmente un cálculo imperativo que resuelva el problema. Me pregunto si Shiva estaba buscando una solución puramente funcional. – Conal
Agregaré a la respuesta excelente de dons
que el mecanismo subyacente aquí es algo llamado MVar
, y es un contenedor imperativo, paralelo para un valor. Usted "pone" y "entra" dentro y fuera de un MVar. Obtener un bloque MVar vacío, al igual que poner uno completo. Es a la vez un mecanismo de comunicación y un mecanismo de sincronización. Creo que fue inventado por Arvind como parte del proyecto Monsoon/* t. Hay una hermosa book by Nikhil and Arvind que explica su dialecto de pH del paralelo Haskell. Muchas de las ideas se han adoptado en GHC, y vale la pena leer el libro.
Además de los enfoques de estado mencionados por Norman y Don, también se puede pensar en la aplicación de la función normal y la pereza como productor y consumidor.
Aquí es un productor de los números naturales:
nats = [1..]
Y aquí es un consumidor que calcula los cuadrados de los números:
squares = map (\x -> x * x) nats
productores como yield return
en C# o generadores en Python a menudo se puede expresar así: como simples listas perezosas en Haskell.
Sin embargo, en Python los generadores pueden tener efectos secundarios (a diferencia de las listas puras). también puede lograr eso con listas monádicas, y también puede generar aquellas con "rendimiento" como en Python con el transformador de mónada GeneratorT del paquete de generador. – yairchu
- 1. problema productor/consumidor con multiproceso de python
- 2. Comunicación interproceso productor-consumidor
- 3. C# productor/consumidor/observador?
- 4. Genérico .Net Productor/Consumidor
- 5. Productor Consumidor - Usando Executors.newFixedThreadPool
- 6. productor-consumidor con sempahores
- 7. C# productor/consumidor
- 8. colas de trabajo productor/consumidor
- 9. Python productor/consumidor con manejo de excepción
- 10. Modelo Productor-Consumidor - semáforo binario o mutex?
- 11. Creando una cola de trabajo multiproceso (consumidor/productor) en C++
- 12. Productor/Consumidor para hablar con dispositivos en serie
- 13. ¿El modelo de productor/consumidor es igual de actor?
- 14. Cualquier problema obvio o mejoras para mi cola de consumidor productor
- 15. La mejor manera de implementar un patrón productor/consumidor múltiple en Java 6
- 16. ¿Cuál es el modismo más apropiado para productor/consumidor en Go?
- 17. ¿Este enfoque de Python productor-consumidor sin bloqueo es seguro para subprocesos?
- 18. Haskell - Problema Compilación en GHC
- 19. ¿Es bueno usar BlockingCollection <T> como consulta FIFO de un solo productor y consumidor único?
- 20. ¿Cómo utilizo una colección de bloqueo en el patrón Productor/Consumidor cuando los productores también son consumidores? ¿Cómo termino?
- 21. Cualquier implementación de cola libre de bloqueo de un solo productor de un solo consumidor en C?
- 22. Qué cola de bloqueo de Java es más eficiente para escenarios de consumidor único de un solo productor
- 23. ThreadDelay Problema en Haskell (GHC) en Ubuntu
- 24. Problema al instalar haskell-platform
- 25. Memoization & Project Euler Problema 15 en Haskell
- 26. Problema con IO "Looping" en Haskell
- 27. consumidor de kafka en R
- 28. ¿Cómo obtener la clave de consumidor y el secreto de consumidor para la API de Gmail?
- 29. Haskell - Marco de Fungen - Problema de representación
- 30. Consumidor de ActiveMQ se bloquea
Esto está muy cerca de http://stackoverflow.com/questions/1234947/can-producer-consumer-problem-be-solved-without-using-assignment. ¿Revisaste las soluciones presentadas allí? – nlucaroni