2016-10-23 3 views
0

나는 파이썬 트위스트 라이브러리를 사용하고 있으며 수신 된 데이터에서 일부 처리를 수행 한 다음 연결을 닫는 데이터를 수신하는 서버를 만들고 있습니다. 나는 프로그램이 print 문없이 dataReceived에 멈추는 것을 관찰한다. print 문을 사용하면 처리가 완료됩니다. 경주 조건을 피하기 위해 인쇄가 어떻게 든 느려지거나 버그를 코딩했는지 궁금합니다. 다음과 같이Twisted dataReceived hangs

내 코드는 다음과 같습니다

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) 

답변

1

OS X (selectreactor)의 기본 트위스트 반응이 kqueue만큼 안정적이지 나에게 나타납니다.

kqueue reactor를 설치 한 후에 더 이상 문제가 표시되지 않습니다.

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