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