que estaba esperando para ver una operación de intercalación no determinista para las fuentes, con una firma de tipo comoNondeterministically intercalación del conducto
interleave :: WhateverIOMonadClassItWouldWant m => [(k, Source m a)] -> Source m (k, a)
El caso de uso es que tengo una aplicación P2P que mantiene conexiones abiertas a muchos nodos de la la red, y en su mayor parte es simplemente esperar mensajes de cualquiera de ellos. Cuando llega un mensaje, no importa de dónde proviene, pero necesita procesar el mensaje lo antes posible. En teoría, este tipo de aplicación (al menos cuando se usa para fuentes tipo socket) podría eludir por completo el administrador IO de GHC y ejecutar el select
/epoll
/etc. llama directamente, pero no me importa cómo se implementa, siempre y cuando funcione.
¿Algo como esto es posible con el conducto? Un enfoque menos general pero probablemente más factible podría ser escribir una función [(k, Socket)] -> Source m (k, ByteString)
que maneje la recepción en todos los sockets por usted.
Me di cuenta de las operaciones ResumableSource
en el conducto, pero todas parecen querer conocer un particular Sink
, que se siente como una fuga de abstracción, al menos para esta operación.
¿Cuán rápido más rápido necesita usted que la solución simple usando forkIO y una Fuente que envuelve un Chan/TChan? –
No necesariamente necesito un alto rendimiento (preveo conectarme con alrededor de 1000 de estos pares como máximo) pero también estoy interesado en estas abstracciones tipo iteración y me preguntaba si era posible proporcionar este tipo de operación. con conductos. Parece un caso de uso razonablemente común para ciertos tipos de protocolos de red. – copumpkin
Creo que el administrador de eventos es lo más parecido posible sin usar 'select' o' epoll' directamente oa través de algún paquete. No creo que exista una interfaz de sondeo expuesta desde el administrador de eventos (no sería mucho un administrador de eventos si lo hiciera) por lo que terminaría con una cantidad de conversaciones y conversaciones con la mayoría de los diseños de todos modos. Lo que haría es comenzar con una 'Fuente' envolviendo un' TChan' acotado, bifurcando un hilo por conexión inicialmente. Vaya al administrador de eventos si es necesario para el rendimiento.Si todavía tienes problemas, siempre hay FFI. –