Brian Demsky's master's thesis compares servers written in direct style
(using a thread per connection) to event driven servers (which are supposedly
oh so much faster.) He shows how you can CPS the thread
per connection server and end up with the event driven server.
That way you don't need to manually mangle your code in an ad hoc way.
Of course, as Peter points out, you can build cooperative multitasking in
Haskell using monads rather that face the pain of using Java like Demsky.


If I recall correctly, the main performance advantages came from avoiding
- thread creation overhead
- excessive context switching
- synchronization due to potential interruptions at inconvenient moments
I suspect Haskell threads are much lighter than Java threads, so
there may not be as large of a payoff.


I'm curious about the difficulties with the monadic cooperative threads.
(I assume Peter meant cooperative threads where a scheduler chooses the next
bit-o-code to run rather than coroutines where the yielder explicitly calls
some other coroutine.) Were the asynchronous IO primitives too ugly to
deal with cleanly, or was the performance gain too small to be worth while?


Regards,

Paul

On Tuesday, November 4, 2003, at 02:58 PM, Peter Simons wrote:

S Alexander Jacobson writes:

Is there a reasonably efficient Haskell httpd
implementation around that uses poll/select?

There is a web server written in Haskell: HWS-WP -- or "Haskell Web Server with Plug-ins". You'll find it at:

    http://sourceforge.net/forum/forum.php?forum_id=253134
    http://cvs.sourceforge.net/viewcvs.py/haskell-libs/libs/hws-wp/

The following paper from Simon Marlow provides a
detailed description of the server's architecture:

    Writing High-Performance Server Applications
    in Haskell, Case Study: A Haskell Web Server

http://www.haskell.org/~simonmar/bib.html

Note that HWS-WP does not use poll(2) directly.
Instead, it relies an Haskell's forkIO function to
spawn concurrent threads of execution. These are
_not_ necessarily system threads, though. GHC, for
instance, does implement IO threads with poll()
internally. Other compilers or run-time systems
may use other techniques.

I have experimented with direct poll()-based
scheduling in Haskell (using a CSP monad to
implement co-routines) and honestly didn't find it
to be worth the extra effort. Eventually, I threw
all the code away and just used forkIO, like
everybody else does.

Peter


P. S.: If you're interested in a poll()-based web server written in C++, though, let me know. I have some code I'm more than willing to share. The server speaks HTTP/1.1 and can deliver static pages. No dynamic content, though. But it _is_ fast. :-)

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell

Reply via email to