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