Proposal: Control.Concurrent.Async
Simon Marlow
marlowsd at gmail.com
Tue Jun 12 12:58:41 CEST 2012
On 08/06/2012 17:31, Thomas Schilling wrote:
> I fixed the docs a tiny bit in: https://github.com/simonmar/async/pull/1
>
> Other comments:
>
> - Module introduction is missing.
Now added.
> - There are no tests whatsoever. I would like to have a few stress
> tests that throw lots of asynchronous exceptions to make sure that
> exception masking etc behaves correctly.
Also added, including a couple of stress tests. (but the test coverage
isn't great, I'll try to improve it in due course)
> - Why is there no waitAnyCancel?
> - Same with waitEitherCancel
Both added.
I think that now addresses all the comments that people had.
There's one more change I'm thinking about: perhaps instead of
wait :: Async a -> IO (Either SomeException a)
waitThrow :: Async a -> IO a
we should reverse the naming scheme, rename waitThrow to wait and wait
to something else (waitCatch?). Rationale: waitThrow seems to be the
version we need most often, and it's simpler to use.
wait :: Async a -> IO a
waitCatch :: Async a -> IO (Either SomeException a)
Thoughts? Better names for waitCatch?
Latest Haddocks:
http://community.haskell.org/~simonmar/async/
Repo:
https://github.com/simonmar/async
Cheers,
Simon
> On 8 June 2012 09:37, Simon Marlow<marlowsd at gmail.com> wrote:
>> 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
>
>
>
More information about the Libraries
mailing list