Зависает Twisted DataReceived

#python #asynchronous #twisted

#python #асинхронный #искаженный

Вопрос:

Я использую библиотеку python twisted и создаю сервер для приема данных, чтобы выполнить некоторую обработку полученных данных, а затем закрыть соединение. Я наблюдаю, что программа зависает в DataReceived без инструкции print. С помощью инструкции print это выполняется. Интересно, print каким-то образом замедляет выполнение, чтобы избежать состояния гонки, или я закодировал ошибку?

Мой код выглядит следующим образом:

 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:

Мне кажется, что twisted reactor по умолчанию для OS X (selectreactor) не так стабилен, как kqueue.

Я больше не вижу проблемы после установки kqueue reactor.

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