cgi "print statement" in multithreaded enviroment?

V

vegetax

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 =)
 
I

Irmen de Jong

vegetax said:
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
 
V

vegetax

Irmen said:
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
 
P

Paul Rubin

vegetax said:
But i want to use "print" as a commodity feature, print >>
self.response,'html..' is longer to type than
self.response.write('html..')

w = self.response.write

w('html...')
w('more html...')
w('still more html')
 
B

Bengt Richter

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
 
V

vegetax

Bengt said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,183
Messages
2,570,967
Members
47,520
Latest member
KrisMacono

Latest Threads

Top