#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