cgi "print statement" in multithreaded enviroment?

Bengt Richter bokr at oz.net
Mon May 2 22:26:32 EDT 2005


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



More information about the Python-list mailing list