Я пытаюсь задуматься о том, как заставить Twisted выполнять из-за отсутствия лучшего слова «интерактивное» поведение клиента/сервера.Интерактивный клиент/сервер Python с Twisted
Мне удалось собрать пару классов Protocol и ClientFactory, которые подключаются к службе и выполняют немедленный запрос/ответ (см .: connectionMade -> self.queryStatus). Это преуспевает, как ожидалось, и выводит ответ сервера из класса Factory.
Моя проблема заключается в том, что у меня будут внешние события, которые должны вызывать передачу данных, всегда прислушиваясь к потенциальным входящим данным. Но как только цикл reactor.run() будет идти, я не уверен, как остальное мое приложение предназначено для запуска отправки данных.
Я попробовал несколько различных подходов, поскольку, но это самый простой подход, который сделал обрабатывать ПРИЕМ часть, как описано:
class myListenerProtocol(LineReceiver):
delimiter = '\n'
def connectionMade(self):
print("Connected to: %s" % self.transport.getPeer())
self.queryStatus(1)
def dataReceived(self, data):
print("Receiving Data from %s" % self.transport.getPeer())
...
self.commandReceived(self.myData)
def commandReceived(self, myData):
self.factory.commandReceived(myData)
def connectionLost(self, reason):
print("Disconnected.")
def queryStatus(self, CommandValue):
...
strSend = CommandValue # or some such
self.transport.write(strSend)
class mySocketFactory(ClientFactory):
protocol = myListenerProtocol
def __init__(self):
pass
def buildProtocol(self, address):
proto = ClientFactory.buildProtocol(self, address)
return proto
def commandReceived(self, myData):
print myData
reactor.stop() # It won't normally stop after recv
def clientConnectionFailed(self, connector, reason):
print("Connection failed.")
reactor.stop()
def main():
f = mySocketFactory()
reactor.connectTCP("10.10.10.1", 1234, f)
reactor.run()
Я полагаю, что это довольно прямо вперед, но бесчисленные часы в многочисленных примеры и документация оставили меня без хорошего понимания того, как я должен заниматься этим сценарием.
Вам не нужно быть осторожным с GIL. Просто не используйте потоки. Ничто в этом сообщении не подразумевает необходимости в потоках, поэтому GIL не имеет значения. – Glyph