cgi "print statement" in multithreaded enviroment?

vegetax vegeta.z at gmail.com
Mon May 2 22:31:40 EDT 2005


Bengt Richter wrote:

> On Mon, 02 May 2005 20:24:02 -0400, vegetax <vegeta.z at 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

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





More information about the Python-list mailing list