Имея 1-дневный опыт в Twisted я стараюсь запланировать отправку сообщений в ответ на TCP клиента:Python скрученный: как планировать?
import os, sys, time
from twisted.internet import protocol, reactor
self.scenario = [(1, "Message after 1 sec!"), (4, "This after 4 secs"), (2, "End final after 2 secs")]
for timeout, data in self.scenario:
reactor.callLater(timeout, self.sendata, data)
print "waited %d time, sent %s\n"%(timeout, data)
Теперь он отправляет сообщения, но у меня есть 2 проблемы:
1) «Тайм-аут» собирается из " теперь », и я хочу считать это после завершения каждой предыдущей задачи (отправлено предыдущее сообщение)
2) Я не знаю, как закрыть соединение после отправки всех сообщений. Если я помещаю self.transport.loseConnection()
после callLater
, он немедленно закрывает соединение.
В предыдущей попытке я не использовал reactor.callLater
, но только self.transport.write()
и time.sleep(n)
в for
цикл. В этом случае все сообщения были отправлены вместе после прохождения всех тайм-аутов ... Не то, что я хотел.
Цель состоит в том, чтобы дождаться соединения с клиентом, ждать timeout1 и отправлять сообщение1, ждать timeout2 и отправлять сообщение2, ... и т. Д. После окончательного сообщения - закрыть соединение.
Спасибо, теперь я понимаю, почему «спит» не работает. Можете ли вы привести пример с расписанием реактор.callLater() в конце предыдущего реактора.callLater()? – DominiCane
Просто определите функцию, которая вызывает 'self.sendata (data)', а затем вызывает 'reactor.callLater()' для следующего обратного вызова и передаёт эту функцию в первый 'reactor.callLater()' вместо 'self.sendata ' –