2012-06-06 79 views
2

我是扭曲的新手。我最近遇到這個問題,希望得到一些幫助。據我所知,雙絞線作爲單線程環路運行。當我產生另一個進程從循環中獲取輸入(並且稍後將結果傳遞迴循環)時,即使沒有任何輸入傳遞給它,該進程也會立即退出(請參閱下面的代碼)。如何保持Twisted spawnProcess長時間運行的進程?

另外,是否有可能讓ONE衍生進程長時間運行,而不是每次接收到輸入時產生新進程?

非常感謝您的時間,

Q

from sys import executable 
from os import environ 
import os 
from twisted.internet import reactor 
from twisted.internet.protocol import Protocol 
from twisted.internet.protocol import Factory 
from twisted.internet import protocol 

implementation = """\ 
import os 
print "in child", os.getpid() 
""" 

class Echo(Protocol): 
    def dataReceived(self, data): 
     reactor.spawnProcess(pp, executable, [executable, "-c", implementation], env=environ) 
     self.transport.write(data) 

class EchoFactory(Factory): 
    def buildProtocol(self, addr): 
     return Echo() 

class MyPP(protocol.ProcessProtocol): 

    def connectionMade(self): 
     print "connectionMade!" 
    def outReceived(self, data): 
     print "out", data 
    def errReceived(self, data): 
     print "error", data 
    def inConnectionLost(self): 
     print "inConnectionLost! stdin is closed! (we probably did it)" 
    def outConnectionLost(self): 
     print "outConnectionLost! The child closed their stdout!" 
    def errConnectionLost(self): 
     print "errConnectionLost! The child closed their stderr." 
    def processExited(self, reason): 
     print "processExited, status %d" % (reason.value.exitCode,) 
    def processEnded(self, reason): 
     print "processEnded, status %d" % (reason.value.exitCode,) 
     print "quitting" 

reactor.listenTCP(8200, EchoFactory()) 
pp = MyPP() 
print 'in parent', os.getpid() 
reactor.spawnProcess(pp, executable, [executable, "-c", implementation], env=environ) 
reactor.run() 

回答

2

扭不控制子進程退出時。子進程負責這個(有一兩個例外,這裏不重要)。您的子進程,運行此代碼的Python程序:

import os 
print "in child", os.getpid() 

只要打印了自己的PID,就會退出。無論是使用Twisted還是以其他方式啓動它,這都是它的行爲。如果你想要它等待輸入,那麼你必須爲程序添加代碼。

+0

是否有可能有一個數據流進入,由python程序處理,然後傳遞迴父級而不退出子進程? –

+1

是的。這是可能的。 –

+0

你能舉一個我怎麼做的例子嗎?例如,我會將進入反應器循環的內容重定向到stdin。 –

相關問題