Остановить скрученный реактор по условию

Есть ли способ остановить закрученный реактор при достижении определенного состояния. Например, если переменная установлена ​​на определенное значение, то реактор должен остановиться?


person gmemon    schedule 29.06.2011    source источник


Ответы (2)


В идеале вы не устанавливаете значение переменной и не останавливаете реактор, а вызываете reactor.stop(). Иногда вы не находитесь в основном потоке, и это запрещено, поэтому вам может потребоваться вызвать reactor.callFromThread. Вот три рабочих примера:

# in the main thread:
reactor.stop()

# in a non-main thread:
reactor.callFromThread(reactor.stop)

# A looping call that will stop the reactor on a variable being set, 
# checking every 60 seconds.
from twisted.internet import task
def check_stop_flag():
    if some_flag:
        reactor.stop()
lc = task.LoopingCall(check_stop_flag)
lc.start(60)
person Jerub    schedule 29.06.2011
comment
Пример циклического вызова - это то, что я искал. Тем не менее, было бы здорово, если бы в реактор можно было добавить событие, которое говорит, что когда установлен some_flag, вызовите some_method, который вызовет response.stop. - person gmemon; 30.06.2011
comment
Спасибо за подробный ответ - person gmemon; 30.06.2011
comment
Спасибо за публикацию. Возникает вопрос, почему по умолчанию response.stop () не вызывает из основного потока ... это кажется ненужным усложнением, но я уверен, что для этого была основная причина. - person wickedchicken; 24.04.2012
comment
Скрученные API не являются потокобезопасными. Это более простой общий подход, чем возможность безопасного вызова некоторого, казалось бы, случайного подмножества из любого потока (что заставит вас постоянно обращаться к документации по любому конкретному API, который вы хотите использовать, чтобы определить, является ли он безопасным). И нецелесообразно делать все API-интерфейсы поточно-ориентированными (накладные расходы времени выполнения недопустимы, а реализация в некоторых случаях становится очень сложной, а сами API-интерфейсы становятся более сложными - например, какой поток вызывает методы фабрики, если фабрика используется с connectTCP в безреакторной ветке?). - person Jean-Paul Calderone; 07.06.2012

Конечно:

if a_variable == 0:
    reactor.stop()
person Gerrat    schedule 29.06.2011