2013-02-11 8 views
6

Piszę serwer w Haskell i chciałbym jawnie zamknąć uchwyt klienta po rozłączeniu. Kiedy zadzwonię pod numer hClose, wątek zostanie zablokowany, dopóki Klient nie zamknie swojej strony uchwytu. Czy istnieje sposób, aby zamknąć go bez blokowania?Haskell hClose blocking

Z góry dziękuję!

+0

Uruchomić to asynchronicznie? Sprawdź http://hackage.haskell.org/packages/archive/async/2.0.1.4/doc/html/Control-Concurrent-Async.html – jozefg

+2

Proponuję użyć biblioteki wysokiego poziomu, takiej jak [conduits] (http://hackage.haskell.org/package/conduit). Poradzi sobie z tymi wszystkimi niskopoziomowymi materiałami i skupi się na implementacji rzeczywistej logiki aplikacji. –

Odpowiedz

10

Jasne, wystarczy uruchomić go w innym wątku:

import Control.Concurrent (forkIO) 

forkIO (hClose handle) 

Jak jozefg stwierdził, można użyć bardziej wyszukane rozwiązania, takie jak te znajdujące się w async, ale nie widzę powodu, aby w tym przypadku.

+0

Nie powoduje to oczywiście odblokowania wątków zablokowanych podczas odczytu z odpowiedniego uchwytu. Rozwiązaniem, które właściwie odblokowuje czytniki, jest używanie funkcji do odczytu z gniazd w Network.Socket, ale to ma swoje własne bóle ... Zabawne, jak samopisujący interfejs niskiego poziomu działa poprawnie z wątkami, ale na wyższym poziomie nie ... – javawizard