[Twisted-Python] [Twisted] #5272: In the core doc, do not call reactor.stop directly in processEnded

exarkun at twistedmatrix.com exarkun at twistedmatrix.com
Mon Sep 26 07:27:39 MDT 2011


On 12:13 pm, a.libran at gmail.com wrote:
>Regarding
>>  The process ''starting'' is different from `ProcessProtocol` methods 
>>being
>>  called.  `ProcessProtocol.processEnded` is ''not'' called until the
>>  reactor is running.
>
>On my own VMs, the processEnded gets called
>
>
>[root at master1 play]# cat fun.py
>from twisted.internet import reactor
>
>from twisted.internet import reactor, protocol
>
>class OneRun(protocol.ProcessProtocol):
>    def processEnded(self, reason):
>        print "Process ended\n"
>
>
>reactor.spawnProcess(OneRun(), executable="echo", args=["echo",
>"hello"], childFDs={0:0, 1:1, 2:2})
>[root at master1 play]# python fun.py
>hello
>Process ended
>
>[root at master1 play]#
>
>
>But once again, on a different VM, I only see "hello" and processEnded
>isn't called.
>
>Both VMs run Python 2.7.1 and Twisted 11.0.0
>
>What is going on?

Thanks for this follow-up.  I noticed that in this snippet, there's no 
`reactor.run()´ call at all.  This is a better example, since it shows 
`processEnded´ being called even though there's no chance of the reactor 
ever being running.  Investigating this, I see that there is an early- 
exit case in process support (in `twisted/internet/process.py´, line 65) 
which may call `processEnded´ even when the reactor is not running. 
Inserting a sleep(1) before the `os.waitpid´ call in that function makes 
it much more likely to trigger this case, since it gives the child 
plenty of time to exit.

This strikes me as a bug.  Can you file a new ticket for this?

Thanks again,
Jean-Paul
>David Kao
>
>
>
>On Mon, Sep 26, 2011 at 8:03 PM, Twisted <trac at twistedmatrix.com> 
>wrote:
>>#5272: In the core doc, do not call reactor.stop directly in 
>>processEnded
>>------------------------+---------------------------------------------------
>>    Reporter:  dkdog   |           Owner:
>>        Type:  defect  |          Status:  closed
>>    Priority:  normal  |       Milestone:
>>   Component:  core    |      Resolution:  worksforme
>>    Keywords:          |          Branch:
>>Branch_author:          |   Launchpad_bug:
>>------------------------+---------------------------------------------------
>>Changes (by exarkun):
>>
>> * status:  reopened => closed
>> * resolution:  => worksforme
>>
>>
>>Comment:
>>
>> > I just found out that reactor.spawnProcess could spawn the 
>>subprocess
>> right away **before** reactor.run is executed.
>>
>> This doesn't seem related to this ticket.
>>
>> > I get the impression that most stuff don't get run until the 
>>reactor
>> event loop is up and running with reactor.run()
>>
>> That's true.  Most stuff.
>>
>> > In this case, who's answering all the ProcessProtocol's methods 
>>like
>> processEnded then, without an event loop?
>>
>> The process ''starting'' is different from `ProcessProtocol` methods 
>>being
>> called.  `ProcessProtocol.processEnded` is ''not'' called until the
>> reactor is running.
>>
>> Further discussion should be moved to the mailing list.  Thanks.
>>
>>--
>>Ticket URL: <http://twistedmatrix.com/trac/ticket/5272#comment:8>
>>Twisted <http://twistedmatrix.com/trac/>
>>Engine of your Internet
>
>_______________________________________________
>Twisted-Python mailing list
>Twisted-Python at twistedmatrix.com
>http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python




More information about the Twisted-Python mailing list