Как объединить callLater и addCallback?

Это так сломано, надеюсь, вы милостивы ко мне:

reactor.callLater(0, myFunction, parameter1).addCallback(reactor.stop)
reactor.run()

myFunction возвращает deferred.

Надеюсь, ясно, что я хочу сделать:

  • как только реактор заработает, я хочу вызвать myFunction . Вот почему я использую 0 в качестве параметра задержки. Нет другого выхода, кроме callLater? Забавно передать ему задержку 0.
  • Я хочу остановить реактор, как только myFunction выполнит задачу.

Проблемы, которые у меня есть до сих пор:

  • AttributeError: экземпляр DelayedCall не имеет атрибута addCallback . Справедливо! Как мне поместить обратный вызов в цепочку обратных вызовов, начатую myFunction тогда?
  • исключения. ТипError: stop () принимает ровно 1 аргумент (2 задано) .

Для решения второй проблемы мне пришлось определить специальную функцию:

def stopReactor(result):
    gd.log.info( 'Result: %s' % result)
    gd.log.info( 'Stopping reactor immediatelly' )
    reactor.stop()

И изменить код на:

reactor.callLater(0, myFunction, parameter1).addCallback(stopReactor)
reactor.run()

(все еще не работает из-за проблемы callLater, но stopReactor теперь будет работать)

Неужели нет другого способа вызвать Reaction.stop , кроме как путем определения дополнительной функции?

10
задан dangonfast 17 November 2011 в 21:17
поделиться