2011-12-12 11 views
5

Quiero crear manualmente buzones TChan para subprocesos donde los mensajes/paquetes de red que ingresan se recopilan en la misma cola que los mensajes de subprocesos locales.¿Cómo adjuntaría un buzón TChan a un hilo y recibiría/enviaría mensajes utilizando sockets?

No estoy seguro de cuál sería el enfoque típico de Haskell aquí. ¿Cómo puedo escribir desde, p. un zócalo a un buzón TChan?

¿Será entonces un buzón con varias colas separadas? ¿O de hecho varios buzones?

He investigado epass pero aún no lo he intentado. Aunque creo que lo que quiero hacer debería ser posible, no tengo realmente una idea detallada para comenzar. ¿Alguien tiene un ejemplo de código de algo similar?

Respuesta

4

Sospecho que de hecho estás pensando demasiado en esto. TChan es una abstracción bastante simple, y simplemente una estructura de datos inerte en sí misma. Si desea usar uno, simplemente haga que los hilos lean/escriban usando como corresponda.

Para conectar un socket, simplemente puede crear un código que sondee el socket y escriba cualquier cosa allí en el TChan. Ponlo en un ciclo infinito, luego enróllalo y déjalo volar. Los hilos de Haskell son bastante ligeros y la inmutabilidad significa que los dolores de concurrencia no existen, así que aparte de tener cuidado de no usar las llamadas FFI de bloqueo (esto podría ser una preocupación con los sockets, así que lea la documentación) no hay razón para dudar en usar threads cuando tienen sentido

Si realmente quieres algo más elegante que eso y encuentras una biblioteca que funcione, quizás epass, entonces lo que realmente quieres es código de ejemplo para esa biblioteca específica.

Ah, y para lo que vale la pena - la implementación de TChan es esencialmente una lista vinculada hecha de TVar s con dos referencias en él, nada más. La lectura mueve el puntero de la cabeza hacia adelante, dejando las celdas anteriores solo para las copias del TChan o el recolector de basura para encontrar, y la escritura crea una nueva celda en el puntero de la cola. Todo eso se hace en las transacciones de STM, por supuesto.

+0

Gracias. Tal vez una reformulación de lo que estoy buscando: quiero enviar desde el exterior mensajes/datos a uno o varios procesos (no una aplicación) en el interior. Me imagino que en realidad es muy difícil recibir, poner en cola y poner en cola esos mensajes y ponerlos en el proceso correcto a menos que cada proceso acepte en un puerto tcp/udp diferente que considero no elegante. –

+0

@JFritsch: Si tienes múltiples procesos, entonces esa es una cuestión diferente de todos modos, ¿no? 'TChan' es para hilos en un solo proceso. Sin embargo, puedes tener un hilo que acepte mensajes en un solo socket y los encamine a 'TChan's para otros hilos. Todas estas son herramientas muy flexibles, por lo que probablemente pueda implementar cualquier estructura de comunicación que desee. –

+0

¿Hay alguna función como self() donde un hilo devuelva un ID único? –

Cuestiones relacionadas