[Haskell-cafe] Concurrency best practices?

Andrew Coppin andrewcoppin at btinternet.com
Sat Feb 5 17:13:01 CET 2011


On 05/02/2011 12:56 PM, Jesper Louis Andersen wrote:
> On Sat, Feb 5, 2011 at 10:46, wren ng thornton<wren at freegeek.org>  wrote:
>
>> Sometimes I need those threads to do some IO like printing logging info.
>
> Logging is easy, especially if you don't mind a performance hit.
> Create an STM.TChan and throw each log message on it. Have a separate
> forkIO'ed process that reads off log messages and prints them.

This is the solution I immediately thought of too. Much cleaner 
abstraction than grubbing around in low-level I/O implementations and such.

> The price however, is that you may be running into a bottleneck upon
> entering messages on the TChan because sadly I can't remember if it is
> asynchronous or synchronous when you add messages to it.

Presumably messages added to the channel appear immediately after the 
transaction commits. The problem is, I think GHC's STM implementation 
might mean that if two transactions both try to log a message, they both 
get rolled back...

> It won't work for general IO either (Though perhaps it is a Writer monad).

There is of course a *reason* why you can't do general I/O inside a 
transaction: The transaction may have seen inconsistent state, and it 
may be re-executed arbitrary times. Think about that before you try to 
shove real I/O into a transaction abstraction...



More information about the Haskell-Cafe mailing list