Hi, folks,
I've made Quixote run in a multi-threaded environment, and this work has
suggested a few changes that I'd like to make in the distribution. I don't
think any of them are particularly unreasonable ;).
It seems like some reorganization along these lines has already been done
in 0.5.1, but I haven't seen the code yet; these suggestions are all made
against the 0.5 codebase.
* Can Publisher.start_time be moved to HTTPRequest?
* At the end of 'try_publish', can the _request object be invalidated in
some manner? (Preferably in a function that I can override in a
subclass of Publisher, like parse_request() but for deleting the
request.) The distinction between this and the finish_*_request
functions is that this function should ALWAYS be called independently
of the session manager etc. stuff.
I would suggest 'clear_request' or something like that; this is
what I have implemented. It should be executed before output is
sent.
Another option is to have a 'clear' function on the HTTPRequest
object to let it know that it's done, but this isn't really the
style of the existing code.
* Can get_request call a function on _publisher, i.e. make _request be a
member of Publisher grabbed through an accessor fn? I can't
override the functionality of get_request, as-is, because it is
a module function.
It would also be nice to have parse_request() set _request through
an accessor function, for the same reason. This could be in
either start_request() or parse_request().
I have put it in parse_request because that is called by
SessionPublisher; start_request seems like a better place to
put it, but that is not called by SessionPublisher.
Eventually I would like to be able to add a mix-in -- say,
'ThreadedPublisherMixin' -- so that one can e.g. have an
AppSpecificPublisher that subclasses from both SessionPublisher and
ThreadedPublisherMixin. This way people who don't want to deal with
threads don't have to, and people who really need to, can.
For example, in my Cartwheel Web site, I have a CartwheelPublisher that
(among other things) has the following three functions:
---
def set_request(self, request):
id = thread.get_ident()
self.request_dict[id] = request
def get_request(self):
id = thread.get_ident()
return self.request_dict[id]
def clear_request(self, request):
id = thread.get_ident()
if self.request_dict.has_key(id):
del self.request_dict[id]
---
These three function definitions are sufficient (in the context of the
other changes) to implement a one-Publisher-many-HTTPRequest Quixote
system.
Context diffs implementing these changes against Quixote 0.5 are attached.
Only publish.py is affected.
thanks,
--titus