Pregunta Implementar el bucle del servidor principal en Haskell?


¿Cuál es la forma generalmente aceptada de implementar el bucle principal de un servidor que necesita esperar en un conjunto heterogéneo de eventos? Es decir, el servidor debe esperar (no estar ocupado) hasta que ocurra una de las siguientes situaciones:

  • nueva conexión de zócalo
  • datos disponibles en un socket existente
  • Señal del sistema operativo
  • devoluciones de llamadas de la biblioteca de terceros

5
2017-09-13 19:08


origen


Respuestas:


Creo que estás pensando en términos de un paradigma C con un solo hilo, E / S sin bloqueo y una llamada select ().

Puedes administrar algo así en Haskell, pero Haskell tiene mucho más que ofrecer:

Te recomiendo que tengas un nuevo hilo para cada punto de contacto con el mundo exterior y mantengas todo coordinado con STM.


6
2017-09-13 19:43



Utilizar takeMVar y putMVar para sincronizar entre hilos. Generalmente bloquean el hilo si la operación no está permitida. Leer docs ghc.


2
2017-09-13 19:17



Me gustaría que quede claro. Creo que las dos soluciones publicadas primero son mejores que esta para el problema específico que tiene, pero aquí hay una manera de resolver el tipo de problema que presentó.

Una forma simple de solucionar esto es tomar tus definiciones como

data SocketConn = ....
data DataAvail = ...
data OSSignal = ...
data Callback = ...

y define la versión no simplificada de

data ServerEvent = Sok SocketConn | Dat DataAvail | Sig OSSignal | Call Callback

handleEvent :: ServerEvent -> IO ()
handleEvent (Soc s) = ....
handleEvent (Dat d) = ....
handleEvent (Sig o) = ....
handleEvent (Call c) = ....

Como he dicho, ¡lee las otras respuestas!


1
2017-09-14 02:43



La memoria transaccional de software (STM) es la forma principal de realizar una espera de múltiples vías.

Sin embargo, por lo que se ve, en tu caso probablemente quieras generar un hilo Haskell separado para cada tarea, y dejar que cada hilo se bloquee mientras no ocurra nada.

No querría crear mil hilos de sistema operativo, pero mil hilos de Haskell no son ningún problema.

(Si estos hilos necesitan coordinarse de vez en cuando, entonces de nuevo, STM es probablemente la manera más simple y confiable de hacerlo).


0
2017-09-14 16:19