Computations that can time out + gathering feedback from threads

Folks, I need to implement computations that can time out (connecting to a server, reading from socket, etc.), plus gather feedback from a few thousands of threads. What is the best way to implement this? Do I launch a thread to sleep and a thread to connect/read from socket and use something like Shared Transaction Memory to wait for either of the two to finish? Also, my "simple scripting engine" launches a few thousands of scripts that connect to a server, exchange commands and update their internal state. I need to wait for all these to finish and get the results of their execution. My scripts are a combination of monads and I run them with runXXX( ... ) from the IO monad so that I can inspect the resulting state. Is there an elegant solution for waiting for all the threads to complete and then figuring out how many of these are in good share according to their end state? Thanks, Joel -- http://wagerlabs.com/

On 10/31/05, Joel Reymont
Folks,
I need to implement computations that can time out (connecting to a server, reading from socket, etc.), plus gather feedback from a few thousands of threads. What is the best way to implement this?
Do I launch a thread to sleep and a thread to connect/read from socket and use something like Shared Transaction Memory to wait for either of the two to finish?
Well you could do it something like this (warning all of this is untested written off the top of my head, most of it is variations of stuff seen elsewhere): parIO f1 f2 = do m <- newEmptyMVar tid1 <- forkIO (child f1 m) tid2 <- forkIO (chid f2 m) res <- takeMVar m killThread tid1 killThread tid2 return res child f m = catch (f >>= putMVar m) (const ()) parIO can then be used to run two actions simulatenously and return when the first of them gets done, which can be used to run an action in parallel with a sleeping action. timetout f d = threadDelay d `parIO` f
Also, my "simple scripting engine" launches a few thousands of scripts that connect to a server, exchange commands and update their internal state. I need to wait for all these to finish and get the results of their execution. My scripts are a combination of monads and I run them with runXXX( ... ) from the IO monad so that I can inspect the resulting state.
Is there an elegant solution for waiting for all the threads to complete and then figuring out how many of these are in good share according to their end state?
Well. You could make all of these scripts write their results to an MVar (which you pass to them when they start). That way you could just have a list of these MVars and do something like: results <- mapM takeMVar resultsMvars When that computations finishes, all the MVars will have been filled (and read), which can only happen after all the scripts have finished (filling in their own MVar). /S -- Sebastian Sylvan +46(0)736-818655 UIN: 44640862
participants (2)
-
Joel Reymont
-
Sebastian Sylvan