2013-02-11 15 views
6

Sto scrivendo un server in Haskell e vorrei chiudere esplicitamente un handle di client dopo che si sono scollegati. Quando chiamo hClose, il thread verrà bloccato fino a quando il client non chiude il lato dell'handle. C'è un modo per chiuderlo senza bloccare?Haskell hChiusura del blocco

Grazie in anticipo!

+0

Lanciare in modo asincrono? Controlla http://hackage.haskell.org/packages/archive/async/2.0.1.4/doc/html/Control-Concurrent-Async.html – jozefg

+2

Ti suggerirei di utilizzare alcune librerie di alto livello come [conduits] (http://hackage.haskell.org/package/conduit). Gestirà tutte queste cose di basso livello per te e potrai concentrarti sull'implementazione della reale logica dell'applicazione. –

risposta

10

Certo, basta eseguirlo in un altro thread:

import Control.Concurrent (forkIO) 

forkIO (hClose handle) 

Come jozefg ha dichiarato, è possibile utilizzare le soluzioni più elaborate, come quelle che si trovano in async, ma non vedo un motivo per in questo caso.

+0

Questo, naturalmente, non sblocca i thread bloccati durante la lettura dall'handle pertinente. Una soluzione che sblocca correttamente i lettori consiste nell'utilizzare le funzioni per la lettura dai socket in Network.Socket, ma che ha mal di testa proprio ... Divertente come l'interfaccia di basso livello auto-descritta funzioni correttamente con i thread ma quella di livello superiore non lo fa ... – javawizard