[Haskell-cafe] thespian thoughts

Simon Michael simon at joyful.com
Mon Oct 24 19:00:13 CEST 2011


Hi Alex. I'm testing thespian in rss2irc, FYI: http://joyful.com/darcsden/simon/rss2irc/browse/rss2irc.hs#L-114 . 

Maybe there's a better way to use it, but for now it brings me one extra thread and higher memory usage/leakage - an instance grew to 350M overnight where I'd normally see 50-100M. The leak may be in my code, but I haven't found it yet. Did you notice high memory usage when using thespian ?

Whether or not I end up keeping it, it has influenced the ordinary thread-based manager for the better, eg see forkMonitoredIO which is like a poor man's monitor using exceptions rather than actor messages.

Best,
- Simon


On Oct 12, 2011, at 8:44 AM, Simon Michael wrote:

> 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 at 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
>> 
>> mQINBE2kb5sBEADO/4u9AVkyz+jEnhgYzfdJ2tIIxOfAL4rqx2jXbxeFVq7vyBRS
>> vM+K8u2Xw2TBC0dXzNy9GiBf9qjZS1EGPPiIvTLsp5aIoQLsO7E6H6g7Z5eqijMC
>> c4qhrnmWsxcOZv8s0iil6H6OXa/EQzP2M1DRmyU8W49Cvo+Jg9hHZGbvdqpNrmYZ
>> ZV5cA9hTneAFe7wixfQ7GDu80dCELmwwWX2adVpeW5dyX0u42Bp7e263GU1wPWTY
>> t5CTkrgvHkFu7Hu3SGt66Q95xvCkK/RFLJbKJyeuHOY3uIa6YWKtMCNPcFz9C520
>> D+MQElWU9xFssxXj626v/GhTGoOPKu948rRgZl5OrBJjzOqaGtrDxuT45qjBfYV2
>> pkVzkTD2/3WNQNZapdrwNjf/fgomUVBTbeow1zPEypg1LHdX2Y58M54l6hCxbcgy
>> JHALDCnROoEPeupJfncIYkp54hL3MJCspPHJoBMHpwfXZgmTNNfEQE2LX4recZ/7
>> PRIAntZ6/MZjBH/1vGc+BcIT5S5Z2J1INeZkEscz3pSl5iR8wYE1VyBRreaQptmq
>> DtIIc2qyRN+BwbF7T0zCdYB2MHW1PA0pS3r4k//K8bmEf1ThH7u9jYuKKANDCltI
>> ariGvz5/CxmW1+JnkSZtwb8w+3qcaMgOGYJhyD6K6RlYqq2htkjteWSdOwARAQAB
>> tDpBbGV4IENvbnN0YW5kYWNoZSAoYWxleCkgPGFsZXhhbmRlci50aGUuYXZlcmFn
>> ZUBnbWFpbC5jb20+iQIcBBMBAgAGBQJNpHAsAAoJEHNeWOpiNrFPBbUP/RCJC7C/
>> 78g0lQ1mvOzmfWoZ/tc0RceZqnfYYhm8VbZ6oNT3G4s2b7T5NdGCWqL1hGYVHupM
>> 6TB4KA2eW8/3xh+oxbdC70i1WQYyfE81oKTSfW2+kBqtPIXueTs9AJ5rRX4cpPBr
>> 8cDTx6tjCe+Vew59hUQ8JxAzs32Ol5mGOf4wpHhS4Un1mJwO+as0kHJnsA15dXoI
>> Moo15NiJL9y77+8u1T6tHbGLYT9J/paoWOglA02FQIdlOAmQdCNhjZ4HKCKmMKsn
>> WwlctvORzH+VtIpF9oxBtu0n3pPAE3wU4GyyVtg27wa+LNg7CEVHhJ/m6QSoPRFa
>> TLYhK7OP4bOPdWZZUM1En4mWQFnb2fyKDPUIjqtbMBP6dcZin0nwRxZzngdLcdpm
>> Prz14F5aS1+NvZOXhkPevBC6xXOnLwEr+egyM0jMGPdE3YnqMKOVR3e6bGE/wvPy
>> OKtebMhFqLy1Yg87p3IU3Tv0Y1WV8GVEZr5lYHkbgM3yIY/WlH+MO5I4j7YXUdXf
>> gvMjOMOxZ4wG8QEfkpdpaBm6JcRAkf9gb7IgBiOmdtC/N8s02NWyjRchvb/kOz5C
>> eSCm6WV07Yhzxm+XTn+L8VxSN5YwCsF7gwD+Mtmone5TdmHS+7JJtjiq8WIbQrv3
>> /cwj2+7pnh7F032s2TpoJw0Og5HqjakiIkzYiQI2BBMBAgAgBQJNpHAsApsPBosJ
>> CAcDAgSVAggDBJYCAwEFiQM9P4AACgkQc15Y6mI2sU8rfRAAtBCtd+XVjuqR/Of4
>> vy8Ev6N1/naqg7zOOQzQXT5UNpuoHO+y4oIYDvjkhGlxK4fVeIUHTQvhXS/INqyX
>> 3oCKXYrzrsAgrq5FVdkRPwUV6H52ik/ani+IoGP2u85Y10DTnPGQnMzVwtN9Z6/T
>> m486XA460J4jCIrRMpm+OJDHN6xUkgZFXaMW+scQK4At2wwcNvuOp9I9T4HP3viy
>> b4g5IVgTsSZZoCIlSEvch2jGbM4hXDnLPFfIdSDxxn91sRgcmkNxCtGvKMVTDGYK
>> JBvJYKki+X/CXfKlPwxTqHHjEbm8+uLyLDL32d7XTiS+0q31XthrVnVummiyIVtp
>> tVhaBeY0JjX6Umi8DeaUWmT1xOckMIXMoAZBGux94hyaeKNEsSYXKQeM7nAvbEf9
>> EYPwoG82qRj/NyxqVH/Cx2IM24OYfoW2HwtU9l3QCHkCK1txCd3PvcWIFoSbwvX5
>> 1wB8/TgdhY4VM5BEJTBHTd8YZ6qi2pHeu+RdZoSCCHqeZA2WmGFpNsxRvHqw0sow
>> YyadDulJu8AWT1+K0DTIxa3YWYIjMV9a/1LV5+/b4xx6KLvIbgS5aWsMMqmdhxMR
>> w1cQ8JtkUSBgx8XzZIXqbMZEIhUmGeTGFBm+dKv91vTvxcM0vrrKPzAgiobRL2EE
>> 43JwGJtFoGAc4zoRBUcXoRzodkc=
>> =9igb
>> -----END PGP PUBLIC KEY BLOCK-----
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20111024/f81fad1e/attachment.htm>


More information about the Haskell-Cafe mailing list