Bengt Richter wrote: > On Mon, 02 May 2005 20:24:02 -0400, vegetax <[EMAIL PROTECTED]> 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
Something like this: class ThreadSpecificFile: def __init__(s): self.files = [] def set_stdout(f,thread_id): self.files[thread_id] = f def clean_up(thread_id): del self.files[thread_id] def write(data): self.files[thread.get_ident()].write(data) sys.stdout = ThreadSpecificFile() Should be a lock for self.files and i am not sure how to make thread.get_ident() atomic -- http://mail.python.org/mailman/listinfo/python-list