[Twisted-Python] question about threading
Phil Christensen
phil at bubblehouse.org
Tue Oct 25 11:05:21 EDT 2005
hey folks,
i've got a quick question for anyone that can help me out. i'm also
in the process of looking this up in the twisted docs/code, but this
is some last minute coding for a big demo tomorrow, so i'm hedging my
bets by posting here.
i've got a relatively simple async twisted server that has a custom
protocol. most everything the server needs to do on a receipt of a
message is short running, but i have one task that isn't.
i need to spawn a thread that executes a couple of binaries (html2ps
and ps2pdf) which are generally long-running. after executing those
binaries, i need to send a message back to the client that sent the
original command to generate the pdf. i tried just creating a basic
thread that holds onto a reference to the client object, but it
doesn't seem to send the command back to the client until i send
another message to the server (any kind of message).
i know there's a bunch of reactor methods that deal with threads, but
i've never used them before, and i'm not sure which one will fix this
issue.
here's my thread subclass:
class PDFGenerator(threading.Thread):
def __init__(self, client):
threading.Thread.__init__(self)
self.client = client
def run(self):
pres = event.getActivePresentation()
t = datetime.datetime.now()
base_name = 'sample-file-name'
out_html = file('/tmp/' + base_name + '.html', 'w')
# [snip snip snip]
# write some html to the file
out_html.close()
os.system('html2ps /tmp/' + base_name + '.html > /tmp/' +
base_name + '.ps') # > /tmp/' + base_name + '_ps.log')
os.system('mkdir data/transcripts/' + str(pres.id))
os.system('ps2pdf /tmp/' + base_name + '.ps data/
transcripts/' + str(pres.id) + '/' + base_name + '.pdf > /tmp/' +
base_name + '_pdf.log')
lock = threading.Lock()
lock.acquire()
self.client.sendCommand('presentTranscript', ['/
transcripts/' + str(pres.id) + '/' + base_name + '.pdf'])
lock.release()
the client object holds a reference to the protocol object, and
sendCommand basically just executes:
print "Sending " + message + " to " + str(self.protocol.source)
self.protocol.transport.write(message + "\0")
i made sure to set the lock, but i think the problem is in how i'm
using threads. the clue i'm seeing is that in the log, i see the
following:
2005/10/25 10:40 EDT [SSProtocol,25,127.0.0.1] Got generateTranscript
('') from IPv4Address(TCP, '127.0.0.1', 49179)
2005/10/25 10:40 EDT [-] Sending presentTranscript,/transcripts/
phil_bubblehouse.org_2005-10-25-10-40-13.pdf to IPv4Address(TCP,
'127.0.0.1', 49179)
you can see that the second log entry doesn't print the protocol
object that's generating the message.
i know there's something simple i'm not doing; any help would be
appreciated.
-phil
More information about the Twisted-Python
mailing list