On 12 Jul 2010, at 15:34, Derek Wueppelmann wrote:

On Sat, 2010-07-10 at 13:37 -0400, Alejandro Imass wrote:
If in a Catalyst::Component, say an extension of Catalyst::Model, the
attributes of my instance are also per-request. In other words if I do
$self->yuca($c->stash->{yuca}) in ACCEPT_CONTEXT and return $self,
will $self->yuca in the Model _instance_ in a separate memory space
for this request?

No.

Each process is in a separate memory space if you're using FCGI or mod_perl or something, but it's not entirely certain (if you use Catalyst::Engine::PSGI and Corona (for example) then multiple requests can be in-flight and sharing the same logicial memory space application (they just have different instances of the request context).

However doing what you suggest above will work for FCGI/mod_perl (or generally anything forked), although it's a bit icky - the instance of your Model lasts forever, and so bashing some of the instance data in each request works..

I would however you return an entirely new instance constructed in ACCEPT_CONTEXT, or use Catalyst::Component::InstancePerContext if you'd like the instance you build to be scoped to the request.

I would suspect that a Catalyst::Controller instance
is paired with a single Model instance for a specific request....

No.

Nothing implies that controllers own models - they're entirely independent (and there can be many controllers and many models involved in processing a request).

but
I'm afraid that being an _instance_ instead of a class, the attributes
may get overriden by a second request that could be running in a
parallel process or thread, say in mod_perl running on Apache prefork
or worker (threads). Then again, I guess I'm answering myself as one
request will run in one process or thread and the data segment is
protected by the underlying OS, so I see no way a second request can
override the attributes of a model instance.

But you're correct here.

From my understanding when you make a request to the system all the
variable and objects are localized to the scope of that request.

Incorrect. If you write into a global variable in request 1, then request 2 (which happens in _that process_) will be able to see the data.

So
making multiple requests open multiple scopes and the data does not mix between them. If you require data to survive past a single request this
is where the session object comes in. You can then store data and
objects that are required to survive past a single request here, however this are specific for the session so don't mix with other requests that
are not related to the session.

But this is kinda right - you can't be certain that you'll get the same application server process twice in a row, so you need to persist data in some way that ensures whatever app server process answers it can find the data..

Cheers
t0m


_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to