Proposal: Control.Concurrent.Async

Heka Treep zena.treep at gmail.com
Wed Jun 13 16:35:39 CEST 2012


2012/6/8, Simon Marlow <marlowsd at gmail.com>:
> I'd like to add a higher-level concurrency API to the base package.
> This API has grown while I've been working on examples for my book, and
> I'm convinced that we should have something like this in the standard
> libraries.  Here's the API I propose:
>
> http://community.haskell.org/~simonmar/async-stm/Control-Concurrent-Async.html
>
> In fact it already exists in at least two packages on Hackage: 'async'
> and 'threads'.  My version is a superset of both of these, except for a
> few small differences (which are up for discussion, of course).
>
> One good reason to have this package is that it avoids some common
> pitfalls, such as forgetting to handle exceptions in your child threads.
>   In the Async API, you get to choose whether to (a) receive the result
> as 'Either SomeException a', or (b) have the exception re-thrown in the
> waiting thread.  You don't get to ignore it altogether.
>
> Another common pitfall avoided by this library is accidentally leaving
> threads running in the background.  This is handled by withAsync:
>
>    withAsync :: IO a -> (Async a -> IO b) -> IO b
>
> the child thread is always cancelled (i.e. killed) when the second
> argument returns or throws an exception, if it hasn't finished already.
>
>
> I'm opening this up for discussion so that we can tidy up any
> inconsistent details and add any functions that people feel are missing.
>   Naming is obviously up for discussion too.
>
> Cheers,
> 	Simon
>
>
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>

Hello, Simon.

I have noticed that the computation strategy plays a role for the
'async' function. For example:

asyncWaitCatch :: Int -> Int -> IO (Either String Int)
asyncWaitCatch m n = async (return $ m `div` n) >>= waitCatch >>=
return . either (const $ Left "divide by zero") Right

gives

-- > asyncWaitCatch 4 2
-- Right 2
-- > asyncWaitCatch 1 0
-- Right *** Exception: divide by zero

but

asyncWaitCatch :: Int -> Int -> IO (Either String Int)
asyncWaitCatch m n = async (return $! m `div` n) >>= waitCatch >>=
return . either (const $ Left "divide by zero") Right

gives

-- > asyncWaitCatch 4 2
-- Right 2
-- > asyncWaitCatch 1 0
-- Left "divide by zero"

as expected.

Also, in this kind of a higher-level interface, I would like to have
some form of message passing. It can be done with STM channels, for
example (I wrote a wrapper around threads and STM channels some times
ago, here is how it looks -
https://github.com/treep/hactors/blob/master/Control/Concurrent/Actor.hs).



More information about the Libraries mailing list