DESCARGAS
FOROS
CHAT
NOTICIAS
REVIEWS
ENLACES
FAQ




    Menu Principal

· Inicio
· Enviar noticia
· Enviar eventos
· Miembros
· Estadísticas
· Buscar

· Administración


    Syndication

RSS Noticias
RSS Foros
RSS Downloads
RSS Reviews
RSS Eventos


    eXactas::Staff

 Bienvenido Invitado
Únete a nosotros!



El registro es completamente gratuito y podrás acceder a todas las partes de la web

 Crear una cuenta



 Login:
Usuario:


Contraseña:









Administradores
No Conectado  l0kit0  
No Conectado  cristian  
No Conectado  lucho  
No Conectado  janus  
No Conectado  chgvisual  
No Conectado  Ecthelyon  




Colaboradores
No hay Colaboradores conectados



Miembros:  Conectados
Miembros:  Miembros: 0
Invitados:  Invitados: 6
Total:  Total: 6



  Miembros Online
No hay miembros conectados


    eXactas::Misiones

eXactas::Misiones


    eXactas::Links

Afiliate a nuestra web



    Últimas descargas

 Programación de juegos para móviles con J2ME. (167)
 Programación de videojuegos con SDL para Windows y Linux. (159)
 Concrete Mathematics 2nd. ed. - NOT-OCR (.PDF) (311)


    Últimos links

· PlanetMath
· Clasificados Buenos Aires
· Muchos exámenes de ALPI y resultados


    eXactas::Citas


Es bien sabido que la ciencia y el nacionalismo son cosas que se contradicen, aunque los monederos falsos de la política nieguen ocasionalmente ese saber: pero también llegará !por fin! el día en que se comprenderá que sólo para un daño puede ahora toda cultura superior seguir cercada por vallas nacionales.

-- Friedrich Nietzsche


    Ephemerids

En un día como hoy...

1822
Se funda en Buenos Aires la Sociedad de Ciencias Físicas y Matemáticas.


    Anti-Spammers

[SPAM poison]



Foros de eXactas.org
No estás conectado





< Tema Anterior   Siguiente Tema > Orden ascendenteOrden descendente  
Autor: Tema: Concurrencia en Haskell
duilio
Moderador





Mensajes: 118
Registrado: 5/6/2004
Estado: Desconectado

  enviado el 23/10/2004 a las 00:27
[Para quienes no sepan programación funcional por favor no lean lo que sigue]

Para quienes quieran hacer programas concurrentes en Haskell, es importante tener en cuenta las limitaciones de cada implementación. Hugs provee concurrencia cooperativa, es decir que un programa como:

module Main(main) where
import Control.Concurrent

main :: IO ()
main = forkIO (loop 'a') >> loop 'z'
where loop ch = putChar ch >> loop ch

en Hugs imprimirá una lista infinita de z's. Si no queremos dejar uno de los threads en starvation, debemos hacer que cooperen, como en:

module Main(main) where
import Control.Concurrent

niceLoop ch = putChar ch >> yield >> niceLoop ch

main :: IO ()
main = forkIO (niceLoop 'a') >> niceLoop 'z'

ahora se imprimen alternadamente a's y z's. Con GHC esto es distinto, ya que el modelo de concurrencia allí es preemptivo.

Una cosa a aclarar es que los threads creados con forkIO son corrutinas en el runtime de la implementación de Haskell particular, no son procesos ni threads a nivel de SO. Si éso es lo que se quiere, se debe utilizar forkOS (no disponible en Hugs, en GHC se debe usar el flag -threaded al enlazar) para crear threads con la biblioteca disponible en el sistema; o forkProcess del módulo System.Posix para crear un nuevo proceso.

Saludos,
Duilio.

 



duilio
Moderador




Mensajes: 118
Registrado: 5/6/2004
Estado: Desconectado

  enviado el 24/10/2004 a las 21:41
Aquí va un ejemplo mas interesante que el anterior (aunque nada original, el
típico servidor de eco).

-- Descomentar la l'inea siguiente si se va a correr
-- como un script ejecutable (Hugs).
-- #!/usr/bin/runhugs +l

module Main(main) where

import Network.Socket
import Control.Concurrent

main :: IO ()
main = withSocketsDo $ -- solo necesario en Windows, pero por portabilidad...
do {
-- socket :: Family -> SocketType -> ProtocolNumber -> IO Socket
sock <- socket AF_INET Stream 0;

-- bindSocket :: Socket -> SockAddr -> IO ()
--
-- iNADDR_ANY es una constante predefinida.
-- Si quiero una direcci'on espec'ifica la puedo
-- construir con inet_addr :: String -> IO HostAddress
bindSocket sock (SockAddrInet (PortNum 5000) iNADDR_ANY);

-- listen :: Socket -> Int -> IO ()
listen sock 5;

-- acceptConnections :: Socket -> IO a
acceptConnections sock;
}

acceptConnections sock = do {
-- accept :: Socket -> IO (Socket, SockAddr)
(newSock, peerAddr) <- accept sock;

forkIO (manageConnection newSock);

acceptConnections sock;
}

manageConnection sock = do {
-- recv :: Socket -> Int -> IO String
s <- recv sock 1024;
putStr ("Received: " ++ s);

send sock s;

sClose sock
}


Éste programa tiene varios problemitas, sugerencias?
Piensen cómo se manejan las señales, cómo se bifurca la salida con forkIO (en acceptConnections estamos aplicando un operador monádico dentro de otra mónada, pues la notación 'do' solo es syntax sugar para >> y 'return').


Saludos,
Duilio.

 


Julian_G
Forista habitué




Mensajes: 49
Registrado: 25/5/2004
Estado: Desconectado

  enviado el 28/10/2004 a las 15:48
Duilio, en acceptConnections, soltando el thread con yield abajo de FokIO se arregla?
Ahora, como funciona ForkIO ??
No tendria que no ser necesario el yield??

Nos vemos. J.

 


duilio
Moderador




Mensajes: 118
Registrado: 5/6/2004
Estado: Desconectado

  enviado el 31/10/2004 a las 13:05
Exacto, el primer problema que tiene mi programa es que no funciona . Que vos lo hayas descubierto significa que lo probaste. Moraleja: la mejor forma de aprender a programar, es programando.

El forkIO duplica el cómputo que venía haciendo la mónada IO. Se acuerdan de C:

if (fork()) {
/* estoy en el padre */
} else {
/* estoy en el hijo */
}

suponiendo que el fork no falla (!= -1). Según el texto fuente tengo un solo programa, pero en realidad en cada bloque C voy a tener un programa ejecutándose como un proceso diferente del otro. Con forkIO pasa algo semejante, si yo combino con el combinador monádico:

forkIO f >> g

ahora las funciones f y g se evalúan en 'procesos' diferentes (aunque en nuestro programa las mónadas son IO, es decir que lo único que se bifurcará será la entrada salida, y NADA MÁS).


Saludos,
Duilio.


[Editado el 31/10/2004 por duilio]

 


Julian_G
Forista habitué




Mensajes: 49
Registrado: 25/5/2004
Estado: Desconectado

  enviado el 31/10/2004 a las 17:07
Parece que en Hugs, el modelo es cooperativo (no lei el primer post !! ), supongo que por eso despues de ForkIO, un Yield funciona.
Mi proceso (el del serverSocket) esta esperando una llamada explicita a un cambio de contexto. Ahora lo veo.
Bueno, nos vemos! J.

 



 



Académico--------------------   > Novedades   > Ciencias Exactas, Ingeniería y Agrimensura          > ACMLA          > Computación Cuántica   > Ciencia Política y Relaciones Internacionales   > Ciencias Médicas   > Ciencias Bioquímicas y Farmacéuticas   > Arquitectura, Planeamiento y Diseño   > Derecho   > Odontología   > Ciencias Agrarias   > Ciencias Veterinarias   > Ciencias Económicas y Estadística          > Universidad Austral - Encuentros          > Universidad Austral - Examenes          > Universidad Austral - Cursado          > Universidad Austral - El ágora   > Psicología   > Humanidades y Artes   > Comunicacion Social   > Politécnico Superior   > Superior de Comercio General--------------------   > Discusión General   > eXactas   > Arte y Cultura          > Música          > Literatura          > Cine y Teatro   > Computación   > Software libre   > eXactas::Proyectos
Powered by XForum 1.81.1 by Trollix Software



Proyecto eXactas iniciado en abril de 2002 por los estudiantes de la F.C.E.I.A. (U.N.R.).
Abierto a todas las comunidades estudiantiles del planeta, persiguiendo la formacion interdisciplinaria.
Debian Powered CHGHOST | Hosting Provider CHGVISUAL | Branding Programs
Se ve mejor a 1024x768
contacto: webmaster@exactas.org