[Twisted-Python] Wrapping blocking code

Bob Ippolito bob at redivi.com
Fri Jul 25 10:38:09 MDT 2003


On Friday, Jul 25, 2003, at 11:42 America/New_York, Justin Johnson 
wrote:

> Thanks for the reply.  Questions below.
>
> On Fri, 25 Jul 2003 10:39:48 -0400, "Bob Ippolito" <bob at redivi.com> 
> said:
>> That's kind of amusing.  I'm not particularly familiar with the log or
>> win32eventreactor modules... but as far as I can tell, those messages
>> mean "dude, don't use log.logOwner anymore".  It's not your fault, 
>> it's
>> the twisted team's fault for not keeping win32eventreactor up to date
>> with the latest conventions.  They're just DeprecationWarnings, so
>> they're harmless to everything other than your eyes and our pride :)
>>
>> Also, instead of using that reactor.iterate() hack.. it's better to be
>> in the habit of writing something event driven.. for example, you 
>> could
>> override the __init__ for protocol.ProcessProtocol (well, it's not
>> really overriding anything, since it doesn't have one) from your
>> subclass, stick a Deferred in the instance, and do a callback in
>> processEnded... like this:
>>
>> class MyProcessProtocol(protocol.ProcessProtocol):
>> 	def __init__(self):
>> 		self.deferred = defer.Deferred()
>>
>> 	...cut and paste your code...
>>
>> 	def processEnded(self, reason):
>> 		...cut and paste some more code...
>> 		self.deferred.callback(reason)
>
> reason is an Exception from twisted.internet.error.  It is an instance 
> of
> ProcessDone if it completes successfully.  How can this be called?  
> When
> I was using the other process.py module, it allowed me to get stdout,
> stderr, and the status.  That is really all I want to do.  So it seems
> like stdout and stderr are easy to get with the xxxReceived methods, 
> and
> then the status would have to be determined from the type of exception
> processEnded gets as the "reason" argument, right?
>
> I used to have code like...
>
> cmd = "cmd arg1 arg2"
> p = process.ProcessOpen(cmd)
> status = p.wait()
> stdout = p.stdout.read()
> stderr = p.stderr.read()
> if status != 0:
>     raise errors.CmdError(cmd, status, stdout, stderr) # an Exception I
>     defined
>
> ...and this was in a module that didn't know about twisted, and I'd
> prefer to keep it that way if possible.  What is the best way to wrap a
> class with methods that contain code like this up with twisted?  
> Attached
> is the latest version of the ProcessProtocol code which is working
> (except for not knowing exactly how to get the real status).  I'm just
> not sure what to do with it.
>
>>
>> ...cut and paste again, but throw out your for loop...
>> p.addBoth(lambda ignore: reactor.callLater(0.0, reactor.stop))
>> reactor.run()
>
> p is not a Deferred, so I can't call addBoth.  It seems to work okay
> without this though.  What was this supposed to be added to?

it was supposed to be p.deferred.addBoth

I'll look at the rest of your stuff in a bit.

-bob





More information about the Twisted-Python mailing list