Использование twisted.internet.reactor внутри подкласса протокола - PullRequest
2 голосов
/ 23 июня 2011

Я новичок в витой и пытаюсь понять шаблоны проектирования для асинхронного программирования в целом и витой в частности. С точки зрения проектирования, это хорошая идея для доступа к реактору из подкласса протокола следующим образом:

class A(Protocol):
   def __init__(self):
      reactor.callLater(5, function_not_defined_here)

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Да, это абсолютно стандартно. Вы можете вызывать реакторные методы из любой точки вашего приложения (pre или post reactor.run()). Единственным исключением является использование потоков, и в этом случае вы захотите обернуть вызовы вашего реакторного метода в reactor.callFromThread(), например:

reactor.callFromThread(reactor.callLater, 5, function_not_defined_here)
2 голосов
/ 23 июня 2011

Вы можете рассмотреть несколько поправок к этому:

  • Примите reactor в качестве аргумента.Это делает ваш код более легко тестируемым, поскольку это означает, что вы можете проходить в фальшивом реакторе в своих модульных тестах, который не зависит от реального времени и может быть проверен для проверки того, A ведет себя как задумано.
  • Неотменить результат reactor.callLater.Сохраните его как атрибут в экземпляре A, чтобы при необходимости вы могли использовать его позже.Например, вы можете отменить его (рассмотрим случай, когда экземпляр A теряет соединение до запуска отложенного вызова).
  • Не вызывать reactor.callLater в A.__init__.Вместо этого назовите это в A.connectionMade.Это немного зависит от того, почему вы вообще используете отложенный вызов, но гораздо более вероятно, что вы захотите сделать что-то через некоторое время после установления соединения, а не через некоторое время после создания экземпляра протокола.Это также позволяет вам иметь экземпляр A, который еще не работает с реактором (это еще одна вещь, которую вы, возможно, захотите сделать в своих юнит-тестах).
...