2011-12-12 13 views
5

Desidero creare manualmente le cassette postali TChan per i thread in cui i messaggi/i pacchetti di rete disponibili vengono raccolti nella stessa coda dei messaggi dai thread locali.Come posso collegare una casella di posta TChan a un thread e ricevere/inviare messaggi usando i socket?

Non sono sicuro del tipico approccio di Haskell. Come posso scrivere ad es. un socket per una casella di posta TChan?

Sarà quindi una cassetta postale con diverse code separate? O in atto diverse caselle di posta?

Ho esaminato epass ma non ho ancora provato. Anche se penso che quello che voglio fare dovrebbe essere possibile, non ho un'idea davvero dettagliata per iniziare. Qualcuno ha un esempio di codice di qualcosa di simile?

risposta

4

Ho il sospetto che stiate davvero pensando troppo a questo. TChan è un'astrazione piuttosto semplice e semplicemente una struttura di dati inerti a sé stante. Se vuoi usarne uno, fai in modo che i thread leggano/scrivano usando come appropriato.

Quindi, per connettere un socket, è possibile semplicemente creare un codice che esegue il polling del socket e scrive qualsiasi cosa lì sullo TChan. Mettilo in un loop infinito, quindi avvolgilo e lascialo volare. I thread di Haskell sono piuttosto dannosi e l'immutabilità significa che il mal di testa per la maggior parte non esiste, quindi oltre a fare attenzione a non bloccare le chiamate FFI (questo potrebbe essere un problema con i socket, quindi leggi la documentazione) non c'è motivo di esitare a usare i thread quando hanno un senso.

Se vuoi davvero qualcosa di più bello e trovare una libreria che funzioni, forse epass, allora quello che vuoi veramente è il codice di esempio per quella libreria specifica.

Oh, e per quel che vale - l'attuazione di TChan è essenzialmente una lista collegata in TVar s con due riferimenti in esso, niente di più. La lettura sposta l'indicatore della testa in avanti, lasciando le celle precedenti da sole per entrambe le copie dello TChan o del garbage collector per trovare, e la scrittura crea una nuova cella sul puntatore di coda. Tutto ciò è fatto nelle transazioni STM, ovviamente.

+0

Grazie. Forse una riformulazione di ciò che sto cercando: voglio inviare da fuori i messaggi/dati a uno o più processi (non un'applicazione) all'interno. Immagino che sia molto difficile ricevere, accodare e d-accodare messaggi di questo tipo e metterli nella giusta procedura, a meno che ogni processo non accetti una diversa porta tcp/udp che non considero elegante. –

+0

@JFritsch: se hai più processi, allora è diverso, comunque? 'TChan' è per i thread in un singolo processo. Si può certamente avere una discussione che accetta i messaggi su un singolo socket e li indirizza a 'TChan's per altri thread, comunque. Questi sono tutti strumenti molto flessibili, quindi è possibile implementare qualsiasi struttura di comunicazione che si desidera. –

+0

Esiste una funzione come self() in cui un thread restituisce un ID univoco? –

Problemi correlati