1

多くの実行時間の長いプロセスを継続的にトリガーしたいと考えています。そして、実行された各プロセスから返されたステータスに基づいて、他のタスクを実行する必要があります。以下の例では、プロセスを生成できますが、メール ループ (つまり、CmdProtocol クラス) に返される生成プロセスの実行ステータスの詳細をキャプチャ/取得することはできません。

私はこのねじれた python の概念に不慣れです - 誰かが私を助けてくれますか?

import sys
from twisted.internet.protocol import ServerFactory, ProcessProtocol
from twisted.protocols.basic import LineReceiver
from twisted.internet import reactor
from twisted.internet import protocol
import os
import signal


class MyPP(protocol.ProcessProtocol):
    def __init__(self):
        self.parent_id = os.getpid()

    def connectionMade(self):
        print "connectionMade!"
        print "Parent id = %s" % self.parent_id
        print "Child process id = %s" % self.transport.pid

    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)"
        print "Parent id = %s" % self.parent_id
        print "Child process id closes STDIN= %s" % self.transport.pid    

    def outConnectionLost(self):
        print "outConnectionLost! The child closed their stdout!"
        print "Parent id = %s" % self.parent_id
        print "Child process id closes STDOUT = %s" % self.transport.pid                

    def errConnectionLost(self):
        print "errConnectionLost! The child closed their stderr."
        print "Parent id = %s" % self.parent_id
        print "Child process id closes ERRCONN = %s" % self.transport.pid    

    def processExited(self, reason):
        print "processExited %s, status %d" % (self.transport.pid, reason.value.exitCode,)

    def processEnded(self, reason):
        print "%s processEnded, status %d" % (self.transport.pid, reason.value.exitCode,)
        print "quitting"

class CmdProtocol(LineReceiver):

    delimiter = '\n'
    def connectionMade(self):
        self.client_ip = self.transport.getPeer()
        print "Client connection from %s" % self.client_ip

    def processcmd(self):
        pp = MyPP()
        cmd = ['c:\Python27\python.exe', '-u',  'print_hi.py']
        print "Calling processcmd - <%s>" % cmd
        reactor.spawnProcess(pp, cmd[0], cmd[1:])

    def connectionLost(self, reason):
        print "Lost client connection.  Reason: %s" % reason

    def lineReceived(self, line):
        if not line: return
        # Parse the command
        print 'Cmd received from %s : %s' % (self.client_ip, line)
        commandParts = line.split()

        if len(commandParts) > 0:
            command = commandParts[0].lower()
            args = commandParts[1:]
            try:
                print "Command received : <%s>" % command
                method = getattr(self, command)
            except AttributeError, e:
                self.sendLine('Error: no such command.')
            else:
                try:
                    res = method()
                    print "Returned status:%s" % res
                    self.sendLine('Command executed successfully.')                
                except Exception, e:
                    self.sendLine('Error: ' + str(e))     

    def do_kill(self, pid):
        """kill: Kill a process (PID)"""
        print 'Killing pid:%s' % pid
        res = os.kill(int(pid), signal.SIGTERM)
        print "Kill Status %s" % res

class MyFactory(ServerFactory):
    protocol = CmdProtocol
    def __init__(self):
        print "Factory called"

reactor.listenTCP(8000, MyFactory())
reactor.run()
4

1 に答える 1

1

これは、実際には非常に基本的な Python データ構造に関する質問です。CmdProtocolのインスタンスから のインスタンスを参照するだけですMyPP。そもそもCmdProtocol構築MyPPするものなので、これは簡単です。MyPPの構造を次のように変更するだけです。

def processcmd(self):
    pp = MyPP(self)

そして、次MyPP.__init__のようになります。

def __init__(self, cmd_protocol):
    self.parent_id = os.getpid()
    self.cmd_protocol = cmd_protocol

次に、 の任意のメソッドで、 を使用して関連するインスタンスにMyPPアクセスできます。CmdProtocolself.cmd_protocol

于 2013-08-07T18:47:25.230 に答える