2015-08-18 3 views
2

Предположим, что я получаю данные по TCP-соединению с высокой скоростью. Я должен сделать какую-то обработку на нем. Поскольку я не хочу блокировать поток реактора, я выгружаю обработку в фоновый поток.Twisted: Замедление данныхПолучено

Данные поступают быстрее, чем я могу обработать его. Если я помещаю данные в очередь, очередь растет бесконечно.

Есть ли способ сказать, что закрученные, чтобы приостановить прием данных?

Протокол TCP может заставить отправителя замедлить работу. Это то, что произойдет, если я обработаю поток реактора (что не является вариантом, так как есть другие, лучше, TCP-соединения).

+0

@barny Вот что я пытался сказать в последнем абзаце. Данные не будут потеряны. Это протокол TCP. Операционная система на стороне отправителя замедлит отправку. – Stefan

+0

Удалил мой немой комментарий. Это любое использование http://twistedmatrix.com/pipermail/twisted-python/2015-January/029068.html Однако я думаю, вам, возможно, придется выяснить, как фактически замедлить работу производителя, поэтому он ограничивает скорость передачи данных. – barny

+0

Как насчет: запустить сценарий обработки данных в одном процессе (а не в потоке) - он блокирует, так что данные становятся дросселированными - и запускают остальные в другом процессе и на разных портах. – barny

ответ

2

Если вы реализуете подкласс Protocol, ваш атрибут transport, вероятно, IPushProducer, что означает, что вам просто нужно позвонить self.transport.pauseProducing() и затем self.transport.resumeProducing() всякий раз, когда вы хотите, чтобы она начнет давать вам данные еще раз. Если вы просто хотите ограничить скорость, вы можете позвонить resumeProducing() после короткой задержки, используя reactor.callLater().

Смежные вопросы