On Mon, 02 May 2005 20:24:02 -0400, vegetax <ve******@gmail.com> wrote:
Irmen de Jong wrote:
vegetax wrote: How can i use cgi'like print statement in a multitreaded web framework?
each thread has its own Servlet instance with request/response objects,
sys.stdout = self.response(which is a file like object) wont work because
all threads will set the same file object and it will be a concurrence
mess.
I am out of ideas here,so any hacks welcome =)
instead of:
print "<html>.....</html>
do:
print >>self.response, "<html>....</html>"
--Irmen
But i want to use "print" as a commodity feature, print >>
self.response,'html..' is longer to type than
self.response.write('html..')
The only clear way i am thinking right now is to write a preprocessor ,like
quixote ptl,but thats sloww
Maybe assign an object to sys.stdout that has write etc methods that check
what thread is calling and use self.response things that you assign to
a property of that sys.stdout object instead of directly to sys.stdout.
I.e., something like
sys.stdout = my_stdout_dispatcher
...
# property out_channels stores self.response with thread id:
sys.stdout.out_channels = self.response(which is a file like object)
...
# print => sys.stdout.write => my_stdout_dispatcher.write('from some thread')
# which atomically looks up right self.response
print 'from some thread'
You may need some lock stuff to do this properly
(to make self.response lookup info access effectively atomic),
but that's a general idea. I don't know what other thread interaction issues
you may have with the state of possibly mutable data being printed.
This is just an idea for an approach. I may not be understanding your problem at all ;-)
Regards,
Bengt Richter