Hi Alex, thanks for the reply (it didn't seem to reach haskell-cafe, if that matters) and the update on status. I passed over CloudHaskell as it seemed (a) over-complex for my needs and (b) not ready, eg not on hackage. I need something that will still permit cabal install rss2irc. But perhaps that's not far off. I'll look again more closely, at both.
Best - Simon
On Oct 11, 2011, at 10:48 PM, Alex Constandache wrote:
Hi Simon,
Sorry for the late reply. I no longer work on thespian, as there is
another project, called Cloud Haskell which provides much more
functionality than thespian (including Erlang style distributed
computing). It is not available on Hackage, but it lives on Github at
https://github.com/jepst/CloudHaskell
Simon Peyton-Johnes himself seems to be associated with the project,
so you should have a look at it. If it does not match your needs, feel
free to hack thespian and send me a pull request on bitbucket. You are
the second person who emailed about thespian in the last month, so
maybe I should reconsider the decision to abandon it (which was
motivated by my desire to avoid contributing to the insane
fragmentation that plagues Hackage).
--Alex
On Sun, Oct 9, 2011 at 12:45 PM, Simon Michael <simon@joyful.com> wrote:
Hi Alexander,
I went looking for something to clean up rss2irc's thread management, and
your recently released thespian package looks like the simplest, most
practical actors/erlang/OTP-ish lib for haskell so far. Thanks!
I need to restart threads (actors) in a controlled way when they die or
hang. I think some of all of that is also part of Erlang/OTP, and maybe it's
already on your todo list. Here are some notes I made, for your interest and
in case you have any further thoughts.
I thought of adding some actor-transforming combinators like these:
-- | Spawn the specified action and restart it whenever it dies, unless
-- the restart frequency exceeds any of the given maximum frequencies in
-- which case throw an exception.
restart :: [Frequency] -> IO a -> IO Address
restart fs action = spawn $ do
setFlag TrapRemoteExceptions
let start times = []
forever
t <- getCurrentTime
update start times
when (any fs exceeded by start times) throw error
worker <- spawn action
monitor worker
receive worker [Case _ -> return ()]
-- | Convert hangs to exceptions using a watchdog timer: spawn the
-- specified action under the control of a watcher which monitors it and
-- also kills it and throws an exception if the worker ever fails to
-- send (something) to the watcher within the specified interval.
watchdog :: Seconds -> (Address -> IO a) -> IO Address
watchdog t action = spawn $ do
watcher <- self
worker <- spawn $ action watcher
monitor worker
forever
receiveTimeout t [Case _ -> return ()
Default -> throw error
]
which I would use something like:
main = do
(feed, bot) <- ...
spawn $ do
reader <- restart [MaxPerHour 2] $ watchdog 60 $ feedReader feed bot
announcer <- restart [MaxPerHour 2] $ watchdog 60 $ ircAnnouncer bot
responder <- restart [MaxPerHour 2] $ watchdog 60 $ ircResponder bot
monitor reader
monitor announcer
monitor responder
setFlag TrapRemoteExceptions
receive [Case e :: RemoteException -> exitFailure (show e) -- one of the
above died or hung too frequently
]
but the types aren't right. I'm not sure if these combinators are possible
with the current thespian api. Also they would complicate things, eg what is
the address of a restarted actor ?
On second thoughts it might be better if these features were built in to the
library. I imagine something like:
main = do ...
reader <- spawnWith [RestartSpec [MinInterval (minutes 5), MaxPerHour
3, MaxPerWeek 6], Watchdog (seconds 60)] $ feedReader feed bot
feedReader = do
forever
poll feed, do stuff
resetWatchdog
What do you think ?
Best - Simon
--
AC
I used to have a signature, but now I don't.
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.45
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
43JwGJtFoGAc4zoRBUcXoRzodkc=
=9igb
-----END PGP PUBLIC KEY BLOCK-----