2013-08-07 2 views
1

Я хочу постоянно запускать много длительных процессов. И, основываясь на возвращенном статусе каждого выполняемого процесса, мне нужно выполнить другие задачи. В приведенном ниже примере я могу обрабатывать процессы, но я не могу захватить/получить информацию о статусе выполнения процессов spawn, возвращенных в цикл почты (например, в классе 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() 
+0

Здесь я планирую реализовать, , когда произошла ошибка при выполнении: - при запуске: - < do this> после завершения: - AKK

ответ

0

Это на самом деле очень простой вопрос о структурах данных 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, вы можете получить доступ к соответствующему CmdProtocol экземпляра с self.cmd_protocol ,

+0

Но до сих пор я не могу получить исполнение статус выполняемого процесса. cmd = ['python.exe', '- u', 'print_hi.py']. Здесь print_hi.py - это выполняемый процесс. Но, после вызова процесса, я всегда вижу успех, хотя print_hi.py получил некоторую ошибку (синтаксическая ошибка). Единственный способ, которым я могу уловить статус, - в MyPP.processExited(), где он дает код состояния (ненулевой для отказа). Итак, когда я вижу некоторый ненулевой статус, я должен вызвать другую функцию, чтобы зафиксировать это. Для этой цели я хочу получить статус в CommandProtocol. Должен ли я использовать некоторые методы обратного вызова здесь. – AKK

+0

Я не понимаю ваш вопрос. Вы говорите: «Я не могу получить статус выполнения», а затем подробно описываю, как вы получили статус выполнения. Вы уже поняли правильный ответ, поэтому, если все, что вам нужно, - это сказать вам «да, идти вперед», тогда да, вперед :) – Glyph

+0

Извините - если я вас смущаю. :-(Я могу получить статус внутри MyPP(), но не смог получить статус в CmdProtocol.Я думаю, что нужно выполнить некоторую операцию с возвратом статуса в CmdProtocol. Как передать управление/статус в CmdProtocol, когда MyPP.processExited() вызывается в MyPP. – AKK

Смежные вопросы