2016-10-23 10 views
0

Ich benutze Python verdrehte Bibliothek und mache einen Server, um Daten zu empfangen, um einige Verarbeitung für die empfangenen Daten zu tun und dann die Verbindung zu schließen. Ich beobachte, dass das Programm in dataReceived ohne eine Druckanweisung hängt. Mit print statement geht es durch. Sie fragen sich, ob der Druck irgendwie die Ausführung verlangsamt, um den race condition zu vermeiden, oder wenn ich einen Fehler programmiert habe?Twisted dataReceived hängt

Mein Code ist wie folgt:

class Stack(Protocol): 
    def __init__(self, factory): 
    self.factory = factory 
    self.bytesremaining = None 
    self.payload = "" 
    self.headerseen = False 
    def dataReceived(self, data): 
    if self.headerseen == False: 
      header = unpack('B',data[0])[0] 
      if header == 128: 
        self.pop() 
        return 
      self.bytesremaining = self.datalength = unpack('B',data[0])[0] 
      print self.datalength #without this print the execution hangs in the middle. 
      if len(data) > 1 and (len(self.factory.pushstack) < 100): 
        self.payload += data[1:] 
        self.bytesremaining -= len(data) - 1 
      self.headerseen = True 
    elif len(self.factory.pushstack) < 100: 
      self.payload += data 
      self.bytesremaining -= len(data) - 1 
    if self.bytesremaining == 0: 
      self.factory.pushstack.appendleft(self.payload) 
      retval = pack('B',0) 
      self.transport.write(retval) 
      self.transport.loseConnection() 

class StackFactory(ServerFactory): 
    def __init__(self): 
    self.clients = [] 
    self.pushstack = collections.deque() 
    self.popstack = collections.deque() 
    self.clientsmap = {} 

    def buildProtocol(self, addr): 
    return Stack(self) 

Antwort

1

Es scheint mir, dass der Standard verdrillt Reaktor für OS X (selectreactor) als kqueue nicht so stabil ist.

Ich sehe das Problem nicht mehr nach der Installation des Kqueue-Reaktors.

from twisted.internet import kqreactor 
kqreactor.install() 
from twisted.internet import reactor