[Lift] Re: Actors in Lift

2009-03-04 Thread David Pollak
On Wed, Mar 4, 2009 at 7:59 AM, debasish ghosh.debas...@gmail.com wrote:


 Dear All -

 I have had a look at Lift quite some time ago. I remember referring to
 this excellent post by David Pollak on the usage of actors in Lift
 (http://blog.lostlake.org/index.php?/archives/59-How-lift-uses-Scala-
 actors.html). Now that I am looking at the code base after quite some
 time, I find lots of changes in it. e.g. the above post refers to
 implementation of Session, Page, Controller etc. as Scala actors that
 nicely interacts in the Request / Response cycle of Lift. But the
 latest snapshot from Github indicates that the usage of actors in Lift
 is now different. Is there any document or pointer that describes the
 rationale of this change or explains the current usage of actors in
 request / response processing ?


Howdy,

As Lift evolved and I did performance analysis, I found that the places
where Actors were used were not necessary, added complexity to the code, and
had adverse performance characteristics.  For example, as I added more
methods to LiftSession, I found that it became increasingly difficult to
choose between methods and messages.  The problem became acute when
Snippets and things external to LiftSession had to access LiftSession's
state during the servicing of a request.  LiftSession needed public methods,
but those exposed state and thus the Actor model broke down.  Yes, I could
have created a CurrentLiftSessionState object that was exposed only to the
current request via S (the thread-local state), but that seemed to be way
too complex.

So, at this point, Actors are used for CometActors and to help service Comet
requests (event-based actors are used to suspend the long poll.)

Does this help?

Thanks,

David






 Thanks.
 - Debasish

 



-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~--~~~~--~~--~--~---



[Lift] Re: Actors in Lift

2009-03-04 Thread David Pollak
On Wed, Mar 4, 2009 at 8:26 AM, debasish ghosh.debas...@gmail.com wrote:


 David -

 Thanks a lot for the clear explanation.

 Just curious - do you think the previous implementation philosophy of
 controllers, sessions and pages as actors with state changes being
 done only through messages was a more FP oriented approach ?


Actually, just the opposite. :-)

Actors and OO are twin concepts.  Actors provide state, data hiding and
messaging (sound like words that come from Smalltalk) in a world where
mutability is eschewed.  It turns out that Actors have their roots in Scheme
and that Smalltalk has its roots in Scheme's Actor implementation (if you
need a reference, I'll dig it up.)

Rarely is LiftSession state mutated directly.  With the exception of
SessionVars, S (threadlocal state) holds a list of state mutations (new
functions that are bound to HTML elements).  Having granular read operations
on LiftSession and application of state changes accumulated in S as part of
the completion of page rendering is about as close as I could get in Scala
to Haskell's state monads.


 And that
 the actor model broke down since Session is inherently an abstraction
 that needs to be more stateful.


The Session is an abstraction that is very, very complex and there's lots of
highly granular data that needs to be exposed during the processing of a
request.  This granular data is better exposed on LiftSession than via
request/response messages or some proxy thingy.

Put another way, it depends on what you mean by state.  It would be
possible to pass a LiftSession around as an explicit parameter and return a
mutated LiftSession... making things feel more functional, but this gets
back to the limitations of Scala vis Haskell's state monad.

Put another way, LiftSession has very few public mutator methods.  It's
mostly read-only.  Is this state in the same way that a JavaBean is
stateful.  Now that's a debate worth having (better line up James and
others.) :-)

Thanks,

David



 Thanks.
 - Debasish

 On Mar 4, 9:10 pm, David Pollak feeder.of.the.be...@gmail.com wrote:
  On Wed, Mar 4, 2009 at 7:59 AM, debasish ghosh.debas...@gmail.com
 wrote:
 
   Dear All -
 
   I have had a look at Lift quite some time ago. I remember referring to
   this excellent post by David Pollak on the usage of actors in Lift
   (http://blog.lostlake.org/index.php?/archives/59-How-lift-uses-Scala-
   actors.html). Now that I am looking at the code base after quite some
   time, I find lots of changes in it. e.g. the above post refers to
   implementation of Session, Page, Controller etc. as Scala actors that
   nicely interacts in the Request / Response cycle of Lift. But the
   latest snapshot from Github indicates that the usage of actors in Lift
   is now different. Is there any document or pointer that describes the
   rationale of this change or explains the current usage of actors in
   request / response processing ?
 
  Howdy,
 
  As Lift evolved and I did performance analysis, I found that the places
  where Actors were used were not necessary, added complexity to the code,
 and
  had adverse performance characteristics.  For example, as I added more
  methods to LiftSession, I found that it became increasingly difficult to
  choose between methods and messages.  The problem became acute when
  Snippets and things external to LiftSession had to access LiftSession's
  state during the servicing of a request.  LiftSession needed public
 methods,
  but those exposed state and thus the Actor model broke down.  Yes, I
 could
  have created a CurrentLiftSessionState object that was exposed only to
 the
  current request via S (the thread-local state), but that seemed to be way
  too complex.
 
  So, at this point, Actors are used for CometActors and to help service
 Comet
  requests (event-based actors are used to suspend the long poll.)
 
  Does this help?
 
  Thanks,
 
  David
 
 
 
   Thanks.
   - Debasish
 
  --
  Lift, the simply functional web frameworkhttp://liftweb.net
  Beginning Scalahttp://www.apress.com/book/view/1430219890
  Follow me:http://twitter.com/dpp
  Git some:http://github.com/dpp

 



-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~--~~~~--~~--~--~---



[Lift] Re: Actors in Lift

2009-03-04 Thread debasish

Thanks again for the cool details. I now get it.

Thanks.
- Debasish

On Mar 4, 9:48 pm, David Pollak feeder.of.the.be...@gmail.com wrote:
 On Wed, Mar 4, 2009 at 8:26 AM, debasish ghosh.debas...@gmail.com wrote:

  David -

  Thanks a lot for the clear explanation.

  Just curious - do you think the previous implementation philosophy of
  controllers, sessions and pages as actors with state changes being
  done only through messages was a more FP oriented approach ?

 Actually, just the opposite. :-)

 Actors and OO are twin concepts.  Actors provide state, data hiding and
 messaging (sound like words that come from Smalltalk) in a world where
 mutability is eschewed.  It turns out that Actors have their roots in Scheme
 and that Smalltalk has its roots in Scheme's Actor implementation (if you
 need a reference, I'll dig it up.)

 Rarely is LiftSession state mutated directly.  With the exception of
 SessionVars, S (threadlocal state) holds a list of state mutations (new
 functions that are bound to HTML elements).  Having granular read operations
 on LiftSession and application of state changes accumulated in S as part of
 the completion of page rendering is about as close as I could get in Scala
 to Haskell's state monads.

  And that
  the actor model broke down since Session is inherently an abstraction
  that needs to be more stateful.

 The Session is an abstraction that is very, very complex and there's lots of
 highly granular data that needs to be exposed during the processing of a
 request.  This granular data is better exposed on LiftSession than via
 request/response messages or some proxy thingy.

 Put another way, it depends on what you mean by state.  It would be
 possible to pass a LiftSession around as an explicit parameter and return a
 mutated LiftSession... making things feel more functional, but this gets
 back to the limitations of Scala vis Haskell's state monad.

 Put another way, LiftSession has very few public mutator methods.  It's
 mostly read-only.  Is this state in the same way that a JavaBean is
 stateful.  Now that's a debate worth having (better line up James and
 others.) :-)

 Thanks,

 David





  Thanks.
  - Debasish

  On Mar 4, 9:10 pm, David Pollak feeder.of.the.be...@gmail.com wrote:
   On Wed, Mar 4, 2009 at 7:59 AM, debasish ghosh.debas...@gmail.com
  wrote:

Dear All -

I have had a look at Lift quite some time ago. I remember referring to
this excellent post by David Pollak on the usage of actors in Lift
(http://blog.lostlake.org/index.php?/archives/59-How-lift-uses-Scala-
actors.html). Now that I am looking at the code base after quite some
time, I find lots of changes in it. e.g. the above post refers to
implementation of Session, Page, Controller etc. as Scala actors that
nicely interacts in the Request / Response cycle of Lift. But the
latest snapshot from Github indicates that the usage of actors in Lift
is now different. Is there any document or pointer that describes the
rationale of this change or explains the current usage of actors in
request / response processing ?

   Howdy,

   As Lift evolved and I did performance analysis, I found that the places
   where Actors were used were not necessary, added complexity to the code,
  and
   had adverse performance characteristics.  For example, as I added more
   methods to LiftSession, I found that it became increasingly difficult to
   choose between methods and messages.  The problem became acute when
   Snippets and things external to LiftSession had to access LiftSession's
   state during the servicing of a request.  LiftSession needed public
  methods,
   but those exposed state and thus the Actor model broke down.  Yes, I
  could
   have created a CurrentLiftSessionState object that was exposed only to
  the
   current request via S (the thread-local state), but that seemed to be way
   too complex.

   So, at this point, Actors are used for CometActors and to help service
  Comet
   requests (event-based actors are used to suspend the long poll.)

   Does this help?

   Thanks,

   David

Thanks.
- Debasish

   --
   Lift, the simply functional web frameworkhttp://liftweb.net
   Beginning Scalahttp://www.apress.com/book/view/1430219890
   Follow me:http://twitter.com/dpp
   Git some:http://github.com/dpp

 --
 Lift, the simply functional web frameworkhttp://liftweb.net
 Beginning Scalahttp://www.apress.com/book/view/1430219890
 Follow me:http://twitter.com/dpp
 Git some:http://github.com/dpp

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
Lift group.
To post to this group, send email to liftweb@googlegroups.com
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en
-~--~~~~--~~--~--~---