<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>
<channel>
	<title>Comments on: It&#8217;s not just about multicores</title>
	<atom:link href="http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/feed/" rel="self" type="application/rss+xml" />
	<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/</link>
	<description>Robert Fischer and Brian Hurt on Punditry, Programming Languages, and Other Religious Issues</description>
	<pubDate>Thu, 20 Nov 2008 13:52:58 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
		<item>
		<title>By: Joe</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31581</link>
		<dc:creator>Joe</dc:creator>
		<pubDate>Wed, 15 Aug 2007 15:11:30 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31581</guid>
		<description>"Check into the advantages of service-oriented architectures for information on why you would want to break them apart. It is a standard way of approaching business applications, particularly those on the net, and the advantages are primarily advantages of scale, resiliency, and maintainability."

Layering 10 levels of java crap on top of each other is a standard way of approaching business applications too, that doesn't mean its a good idea.  Again, in this example seperating file download part out of your app just moves the problem.  You still have to impliment the file download, and you are either going to do it nicely using an event driven or userland thread/task approach, or you are going to do it poorly using a process per request approach (or a little less poorly using a thread per process approach).  Admitting that there is no way to do this with PHP/rails doesn't exactly support the claim that a process per request model is ideal.

"I grant that you could have one process doing all that stuff, and that’s a nifty technological feat — I just don’t see a lot of practical gain out of it."

Scaling and performance are the practical gains.  A well architected app server will scale and perform signficantly better than a process per request server will in some cases, and it will perform slightly better in other cases.  There's no trade off where its worse for anything, so why not do it this way?  Compare ocsigen to apache+php, there's a whole slew cases where php just can't do things effeciently because of its process per request model, where ocsigen will handle it just fine.

"Sure, Rails scales using process-per-request…but the only problem with that is that the process is being too many things at once (user communication tool, database communication tool, file system communication tool)."

The other problems are it makes caching far more complex and slower, it is terrible for handling large numbers of simultaneous connections, it makes persistant connections for long lived multi-request processing so complex that its simply not done, it makes you either waste tons of db connections, start and tear down db connections on every request, or add yet another layer to handle db connection pooling for you because rails can't since its architected wrong, and I'm sure there's other problems I am not thinking of off the top of my head.  Considering the fact that there is no downside to using an effecient architecture, why would you want to use a poor one like process per request?

"I’ve got nothing against cool tricks per se — I’ve done more of them in my time than I probably should have — I just don’t see this one as a revolutionary new capability."

Its not supposed to be a revolutionary new capability, or a cool trick.  Its just demonstrating one way to create a nicer abstraction that gives you the architectural benefits of event driven servers, while being simpler and easier to understand/debug/code than using an event driven style directly.

This is why DHH's hand-waving dismissal of rails poor scalability is so pathetic.  He pretends that "its just like every other shared nothing architecture so it scales perfectly", while completely ignoring the practical implications of using such a bad architecture in reality.

Brian: Does jocaml actually use heavyweight threads/processes that would force a context switch?  Having not looked at the code, I would have hoped it was implimented using a single threaded userland scheduler like erlang does, allowing for tens of thousands of "processes" (tasks) with very low context switch costs.  How useful jocaml will be depends a lot on the implimentation details.

Also guys, you've got a PHP warning on the bottom of the page.</description>
		<content:encoded><![CDATA[<p>&#8220;Check into the advantages of service-oriented architectures for information on why you would want to break them apart. It is a standard way of approaching business applications, particularly those on the net, and the advantages are primarily advantages of scale, resiliency, and maintainability.&#8221;</p>
<p>Layering 10 levels of java crap on top of each other is a standard way of approaching business applications too, that doesn&#8217;t mean its a good idea.  Again, in this example seperating file download part out of your app just moves the problem.  You still have to impliment the file download, and you are either going to do it nicely using an event driven or userland thread/task approach, or you are going to do it poorly using a process per request approach (or a little less poorly using a thread per process approach).  Admitting that there is no way to do this with PHP/rails doesn&#8217;t exactly support the claim that a process per request model is ideal.</p>
<p>&#8220;I grant that you could have one process doing all that stuff, and that’s a nifty technological feat — I just don’t see a lot of practical gain out of it.&#8221;</p>
<p>Scaling and performance are the practical gains.  A well architected app server will scale and perform signficantly better than a process per request server will in some cases, and it will perform slightly better in other cases.  There&#8217;s no trade off where its worse for anything, so why not do it this way?  Compare ocsigen to apache+php, there&#8217;s a whole slew cases where php just can&#8217;t do things effeciently because of its process per request model, where ocsigen will handle it just fine.</p>
<p>&#8220;Sure, Rails scales using process-per-request…but the only problem with that is that the process is being too many things at once (user communication tool, database communication tool, file system communication tool).&#8221;</p>
<p>The other problems are it makes caching far more complex and slower, it is terrible for handling large numbers of simultaneous connections, it makes persistant connections for long lived multi-request processing so complex that its simply not done, it makes you either waste tons of db connections, start and tear down db connections on every request, or add yet another layer to handle db connection pooling for you because rails can&#8217;t since its architected wrong, and I&#8217;m sure there&#8217;s other problems I am not thinking of off the top of my head.  Considering the fact that there is no downside to using an effecient architecture, why would you want to use a poor one like process per request?</p>
<p>&#8220;I’ve got nothing against cool tricks per se — I’ve done more of them in my time than I probably should have — I just don’t see this one as a revolutionary new capability.&#8221;</p>
<p>Its not supposed to be a revolutionary new capability, or a cool trick.  Its just demonstrating one way to create a nicer abstraction that gives you the architectural benefits of event driven servers, while being simpler and easier to understand/debug/code than using an event driven style directly.</p>
<p>This is why DHH&#8217;s hand-waving dismissal of rails poor scalability is so pathetic.  He pretends that &#8220;its just like every other shared nothing architecture so it scales perfectly&#8221;, while completely ignoring the practical implications of using such a bad architecture in reality.</p>
<p>Brian: Does jocaml actually use heavyweight threads/processes that would force a context switch?  Having not looked at the code, I would have hoped it was implimented using a single threaded userland scheduler like erlang does, allowing for tens of thousands of &#8220;processes&#8221; (tasks) with very low context switch costs.  How useful jocaml will be depends a lot on the implimentation details.</p>
<p>Also guys, you&#8217;ve got a PHP warning on the bottom of the page.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brian</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31580</link>
		<dc:creator>Brian</dc:creator>
		<pubDate>Wed, 15 Aug 2007 01:09:14 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31580</guid>
		<description>Bulk replies once again.  Chia- I do kinda wish we had a more threaded model for comments, so replys can go with the original comments.

Kirit:  That's the big advantage Deferreds have over Futures- you can't express circular dependencies.  Which is good, because circular dependencies are always deadlocks.  If monad B depends upon monad A, monad A can't depend upon monad B.  Also note that we're doing functional programming's approach of having lots of immutable objects- the deferred monad for reading line n and the deferred monad for reading line n+1 are different objects.  So you can express that some computation requires line n to be read, but must be completed before line n+1 is read.

Chris Khoo, Brit Butler: I'm learning Haskell at the moment.  Primarily because the lack of static typing is annoying.  Both have interesting things to say about asynchronous programming.  Also, I'd recommend &lt;a HREF="http://enfranchisedmind.com/blog/archive/2007/02/08/191" rel="nofollow"&gt;this post of mine&lt;/A&gt; for more indepth discussion of functional programming and parallelism.

Chia: You're right- it's a good sign when a web server takes a full minute to process your query because then you know the web server is making full utilization of it's I/O capabilities.  More seriously: simply because that is what people people are optimizing for doesn't mean it's what they should be optimizing for.  They may just be making lemonaid from the lemons they've built.  Note that the monad implementation has the same performance as the naive implementation in the loaded case (the monad implementation will simply devolve into doing everything synchronously).  The big advantage the monad implementation will have is that it will be signifigantly more responsive in the common case where the server is unloaded, and I/O can be done in parallel.

As for Jocaml, I'm not sure the two are completely contiguous.  Most of the computations being deferred are really, really small (a few dozen, maybe a few hundred, clock cycles).  Forcing a task switch costing thousands to tens of thousands of clock cycles to perform a few hundred clock cycles is just silly.

code17: a more accurate comparison would be with old-style big event loops.  The heart of the deferred monad is a big ol' select call.</description>
		<content:encoded><![CDATA[<p>Bulk replies once again.  Chia- I do kinda wish we had a more threaded model for comments, so replys can go with the original comments.</p>
<p>Kirit:  That&#8217;s the big advantage Deferreds have over Futures- you can&#8217;t express circular dependencies.  Which is good, because circular dependencies are always deadlocks.  If monad B depends upon monad A, monad A can&#8217;t depend upon monad B.  Also note that we&#8217;re doing functional programming&#8217;s approach of having lots of immutable objects- the deferred monad for reading line n and the deferred monad for reading line n+1 are different objects.  So you can express that some computation requires line n to be read, but must be completed before line n+1 is read.</p>
<p>Chris Khoo, Brit Butler: I&#8217;m learning Haskell at the moment.  Primarily because the lack of static typing is annoying.  Both have interesting things to say about asynchronous programming.  Also, I&#8217;d recommend <a HREF="http://enfranchisedmind.com/blog/archive/2007/02/08/191" rel="nofollow">this post of mine</a> for more indepth discussion of functional programming and parallelism.</p>
<p>Chia: You&#8217;re right- it&#8217;s a good sign when a web server takes a full minute to process your query because then you know the web server is making full utilization of it&#8217;s I/O capabilities.  More seriously: simply because that is what people people are optimizing for doesn&#8217;t mean it&#8217;s what they should be optimizing for.  They may just be making lemonaid from the lemons they&#8217;ve built.  Note that the monad implementation has the same performance as the naive implementation in the loaded case (the monad implementation will simply devolve into doing everything synchronously).  The big advantage the monad implementation will have is that it will be signifigantly more responsive in the common case where the server is unloaded, and I/O can be done in parallel.</p>
<p>As for Jocaml, I&#8217;m not sure the two are completely contiguous.  Most of the computations being deferred are really, really small (a few dozen, maybe a few hundred, clock cycles).  Forcing a task switch costing thousands to tens of thousands of clock cycles to perform a few hundred clock cycles is just silly.</p>
<p>code17: a more accurate comparison would be with old-style big event loops.  The heart of the deferred monad is a big ol&#8217; select call.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31579</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Tue, 14 Aug 2007 22:33:13 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31579</guid>
		<description>@Joe

Check into the advantages of service-oriented architectures for information on why you would want to break them apart.  It is a standard way of approaching business applications, particularly those on the net, and the advantages are primarily advantages of scale, resiliency, and maintainability.

I grant that you could have one process doing all that stuff, and that's a nifty technological feat -- I just don't see a lot of practical gain out of it.  Sure, Rails scales using process-per-request...but the only problem with that is that the process is being too many things at once (user communication tool, database communication tool, file system communication tool).  I'd rather fix the underlying problem (have the request handler do one thing and do it well) than gloss over it with a cool trick.

I've got nothing against cool tricks per se -- &lt;a href="http://search.cpan.org/src/CHIA/Regexp-Tr-0.05/Tr.pm" target="v" rel="nofollow"&gt;I've done more of them in my time than I probably should have&lt;/a&gt; -- I just don't see this one as a revolutionary new capability.</description>
		<content:encoded><![CDATA[<p>@Joe</p>
<p>Check into the advantages of service-oriented architectures for information on why you would want to break them apart.  It is a standard way of approaching business applications, particularly those on the net, and the advantages are primarily advantages of scale, resiliency, and maintainability.</p>
<p>I grant that you could have one process doing all that stuff, and that&#8217;s a nifty technological feat &#8212; I just don&#8217;t see a lot of practical gain out of it.  Sure, Rails scales using process-per-request&#8230;but the only problem with that is that the process is being too many things at once (user communication tool, database communication tool, file system communication tool).  I&#8217;d rather fix the underlying problem (have the request handler do one thing and do it well) than gloss over it with a cool trick.</p>
<p>I&#8217;ve got nothing against cool tricks per se &#8212; <a href="http://search.cpan.org/src/CHIA/Regexp-Tr-0.05/Tr.pm" target="v" rel="nofollow">I&#8217;ve done more of them in my time than I probably should have</a> &#8212; I just don&#8217;t see this one as a revolutionary new capability.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Joe</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31578</link>
		<dc:creator>Joe</dc:creator>
		<pubDate>Tue, 14 Aug 2007 21:57:58 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31578</guid>
		<description>And how is your REST service architected?  Pushing the problem back with another level of unwanted overhead isn't solving the problem, its throwing up your hands and saying "my tools are incapable of solving the problem, I will use some other tool instead".  I have no idea why you think having the user management and file service depend on each other is bad, they have to.  If the user management is broken, then the file service can't get the user specific info to insert into the file, so its broken too.  Seperating them (as in seperate processes) buys you none of the things you mentioned, I can't think of any benefits at all.  Obviously seperating them code wise (as in modules) would still be done when using a single process, so the idea that the code would be cleaner is silly.

And there is nothing fancy or complicated about this architecture, its perfectly normal.  In C/C++ land its done using callbacks in an event driven style (notice how all the high performance webservers are like this?), but for the sake of making it easier for programmers, using a lightweight thread/task abstraction is nicer (although equivilent).

As for why not jocaml, there is no real reason why not.  Its the same idea, just using an existing implimentation vs writing your own.  In practical "I am writing this as we speak" terms, jocaml may or may not perform adequately, or offer the flexibility needed, I haven't looked into it much yet.  But in the big picture "can't jocaml do this now or at some point in the future?", yes it can/will.</description>
		<content:encoded><![CDATA[<p>And how is your REST service architected?  Pushing the problem back with another level of unwanted overhead isn&#8217;t solving the problem, its throwing up your hands and saying &#8220;my tools are incapable of solving the problem, I will use some other tool instead&#8221;.  I have no idea why you think having the user management and file service depend on each other is bad, they have to.  If the user management is broken, then the file service can&#8217;t get the user specific info to insert into the file, so its broken too.  Seperating them (as in seperate processes) buys you none of the things you mentioned, I can&#8217;t think of any benefits at all.  Obviously seperating them code wise (as in modules) would still be done when using a single process, so the idea that the code would be cleaner is silly.</p>
<p>And there is nothing fancy or complicated about this architecture, its perfectly normal.  In C/C++ land its done using callbacks in an event driven style (notice how all the high performance webservers are like this?), but for the sake of making it easier for programmers, using a lightweight thread/task abstraction is nicer (although equivilent).</p>
<p>As for why not jocaml, there is no real reason why not.  Its the same idea, just using an existing implimentation vs writing your own.  In practical &#8220;I am writing this as we speak&#8221; terms, jocaml may or may not perform adequately, or offer the flexibility needed, I haven&#8217;t looked into it much yet.  But in the big picture &#8220;can&#8217;t jocaml do this now or at some point in the future?&#8221;, yes it can/will.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31577</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Tue, 14 Aug 2007 17:22:49 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31577</guid>
		<description>Joe --

My point was that 1) I'm not sure if I buy the complexity/benefit trade-off of using futures to have one single-threaded process going to town on all these things, and 2) if you are already heading this direction, why not just just go to JoCaml?

You didn't approach #2, so let's focus on #1, and specifically, let's consider your case.  To handle that situation in the process-per-request Rails implementation, you could provide a service sitting on that file which the actual request handling would call out to (see &lt;a href="http://en.wikipedia.org/wiki/REST" target="v" rel="nofollow"&gt;REST&lt;/a&gt;).  That way, you don't have to even think about (or fork) the big file munging code while you're working on the user management code.  And if your user management or file service goes down, it doesn't take the other with it.  Plus you get enhanced and more targetable scalability, generally cleaner code, a versioning balwark, etc., etc. -- all the normal service-oriented architecture goodness.

Even if I had a fancy single-process-multiple-request structure, I would probably structure things that way.  So your example doesn't have any architecture consequence.</description>
		<content:encoded><![CDATA[<p>Joe &#8211;</p>
<p>My point was that 1) I&#8217;m not sure if I buy the complexity/benefit trade-off of using futures to have one single-threaded process going to town on all these things, and 2) if you are already heading this direction, why not just just go to JoCaml?</p>
<p>You didn&#8217;t approach #2, so let&#8217;s focus on #1, and specifically, let&#8217;s consider your case.  To handle that situation in the process-per-request Rails implementation, you could provide a service sitting on that file which the actual request handling would call out to (see <a href="http://en.wikipedia.org/wiki/REST" target="v" rel="nofollow">REST</a>).  That way, you don&#8217;t have to even think about (or fork) the big file munging code while you&#8217;re working on the user management code.  And if your user management or file service goes down, it doesn&#8217;t take the other with it.  Plus you get enhanced and more targetable scalability, generally cleaner code, a versioning balwark, etc., etc. &#8212; all the normal service-oriented architecture goodness.</p>
<p>Even if I had a fancy single-process-multiple-request structure, I would probably structure things that way.  So your example doesn&#8217;t have any architecture consequence.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Joe</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31576</link>
		<dc:creator>Joe</dc:creator>
		<pubDate>Tue, 14 Aug 2007 16:29:33 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31576</guid>
		<description>Robert: You are missing the big picture because you seem to be thinking with the assumption that 1 process is handling 1 request.  I want 1 process to handle hundreds of requests at the same time.  It could easily have 30 or 40 queries (all from different users) that have been sent to the database and are waiting for results.  Meanwhile its still going ahead and doing the rest of the work for other requests: serving pages, rendering templates, etc.  Just because you can't advance the computation of the request that triggered the database query, that doesn't mean you can't advance the computation of the other hundred requests while you're waiting on the db.

A single process application server using userland threading and non-blocking I/O is much faster and more effecient than a process per request model, and it allows for much easier caching and sharing data.  This allows you to write your app in a better performing way instead of being forced into using a bad implimentation by the architecture limitations.

Lets say I want to have in my ruby on rails or PHP app a page that opens an 8MB file and sends its contents to clients while doing a search and replace on its contents (the replaced value varies per user).  There is no good way to do this using a process per request model like rails or PHP, you have to do it a bad way just because of the limitations imposed by the multi process architecture.  In a good app server you can read in the file on startup, search for the value and split the file contents on that in advance, and then when serving each request it can share that data and just plug in the per-user replacement data along the way.</description>
		<content:encoded><![CDATA[<p>Robert: You are missing the big picture because you seem to be thinking with the assumption that 1 process is handling 1 request.  I want 1 process to handle hundreds of requests at the same time.  It could easily have 30 or 40 queries (all from different users) that have been sent to the database and are waiting for results.  Meanwhile its still going ahead and doing the rest of the work for other requests: serving pages, rendering templates, etc.  Just because you can&#8217;t advance the computation of the request that triggered the database query, that doesn&#8217;t mean you can&#8217;t advance the computation of the other hundred requests while you&#8217;re waiting on the db.</p>
<p>A single process application server using userland threading and non-blocking I/O is much faster and more effecient than a process per request model, and it allows for much easier caching and sharing data.  This allows you to write your app in a better performing way instead of being forced into using a bad implimentation by the architecture limitations.</p>
<p>Lets say I want to have in my ruby on rails or PHP app a page that opens an 8MB file and sends its contents to clients while doing a search and replace on its contents (the replaced value varies per user).  There is no good way to do this using a process per request model like rails or PHP, you have to do it a bad way just because of the limitations imposed by the multi process architecture.  In a good app server you can read in the file on startup, search for the value and split the file contents on that in advance, and then when serving each request it can share that data and just plug in the per-user replacement data along the way.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Brit Butler</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31574</link>
		<dc:creator>Brit Butler</dc:creator>
		<pubDate>Tue, 14 Aug 2007 14:01:47 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31574</guid>
		<description>I'm also very curious what your thoughts on Erlang specifically are and working on learning some at present.</description>
		<content:encoded><![CDATA[<p>I&#8217;m also very curious what your thoughts on Erlang specifically are and working on learning some at present.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: code17</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31573</link>
		<dc:creator>code17</dc:creator>
		<pubDate>Tue, 14 Aug 2007 13:59:45 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31573</guid>
		<description>AFAICS, what you're talking about is a monadic style (or say CPS, as next op passed in as arguments of bind) user-space threads implementation. If that's true, there are several such kind of OCaml libraries existed for long time. E.g. lwt is probably the most popular one and adopted in many projects (unison, ocsigen, ocamlp3l etc). Could you elaborate the difference here?</description>
		<content:encoded><![CDATA[<p>AFAICS, what you&#8217;re talking about is a monadic style (or say CPS, as next op passed in as arguments of bind) user-space threads implementation. If that&#8217;s true, there are several such kind of OCaml libraries existed for long time. E.g. lwt is probably the most popular one and adopted in many projects (unison, ocsigen, ocamlp3l etc). Could you elaborate the difference here?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Robert Fischer</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31572</link>
		<dc:creator>Robert Fischer</dc:creator>
		<pubDate>Tue, 14 Aug 2007 13:47:36 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31572</guid>
		<description>I'm still not sure how valuable these kinds of things are for a web application.  In that structure, you're usually unable to advance much (if any) computation until you get the result of the SQL query or file read back.  And letting the process block in order to let another process go ahead is a nice, simple way to get the scaling you need on a busy web server.  Your system would go faster in a non-busy web server, but that's not the case we're optimizing for.

And if you're digging at this spot, I'm not sure why you don't just go to &lt;a href="http://jocaml.inria.fr/" target="v" rel="nofollow"&gt;JoCaml&lt;/a&gt;, particularly considering its recent resurrection and the increased interest.

(BTW, Java technically has a &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html" target="v" rel="nofollow"&gt;Future&lt;/a&gt;, with some implementations, but I've never seen a particularly good use of them.  Does anyone have an example with code?)</description>
		<content:encoded><![CDATA[<p>I&#8217;m still not sure how valuable these kinds of things are for a web application.  In that structure, you&#8217;re usually unable to advance much (if any) computation until you get the result of the SQL query or file read back.  And letting the process block in order to let another process go ahead is a nice, simple way to get the scaling you need on a busy web server.  Your system would go faster in a non-busy web server, but that&#8217;s not the case we&#8217;re optimizing for.</p>
<p>And if you&#8217;re digging at this spot, I&#8217;m not sure why you don&#8217;t just go to <a href="http://jocaml.inria.fr/" target="v" rel="nofollow">JoCaml</a>, particularly considering its recent resurrection and the increased interest.</p>
<p>(BTW, Java technically has a <a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/Future.html" target="v" rel="nofollow">Future</a>, with some implementations, but I&#8217;ve never seen a particularly good use of them.  Does anyone have an example with code?)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Chris Khoo</title>
		<link>http://enfranchisedmind.com/blog/2007/08/13/its-not-just-about-multicores/#comment-31570</link>
		<dc:creator>Chris Khoo</dc:creator>
		<pubDate>Tue, 14 Aug 2007 10:23:00 +0000</pubDate>
		<guid isPermaLink="false">http://enfranchisedmind.com/blog/archive/2007/08/13/323#comment-31570</guid>
		<description>I'm aware of this, and putting some time into mastering Erlang at the moment.

Out of curiosity, what do you think of Haskell &#38; Erlang?  They both seem similar from my newbie perspective other than the fact that one is static/dynamic typing, and I know Haskell has a thing called type classes which is apparently a pretty good thing.

Chris</description>
		<content:encoded><![CDATA[<p>I&#8217;m aware of this, and putting some time into mastering Erlang at the moment.</p>
<p>Out of curiosity, what do you think of Haskell &amp; Erlang?  They both seem similar from my newbie perspective other than the fact that one is static/dynamic typing, and I know Haskell has a thing called type classes which is apparently a pretty good thing.</p>
<p>Chris</p>
]]></content:encoded>
	</item>
</channel>
</rss>
