Соединение дважды со скрученным - как сделать это правильно?

Я хочу использовать скрученный (и StarPy, который является реализацией протокола для звездочки ami) соединяться с сервером звездочки. Приложение инициирует исходящий факс там. Я нашел некоторые подсказки на своей проблеме, но я не могу узнать, как обработать это правильно.

Первый факс отослан правильно.

Проблема, если я называю скрученными во второй раз, когда приложение продолжает зависать в основном цикле.

Я знаю, что НЕ могу сделать этого как здесь:

from starpy import manager
from twisted.internet import reactor

def main():
    f = manager.AMIFactory(cUser, cPass)
    print "Login"
    df = f.login(cServer, cPort)

    def onLogin(protocol):
        print "Logoff again"
        df = protocol.logoff()

        def onLogoff( result ):
            print "Logoff erfolgt"
            reactor.stop()

        return df.addCallbacks( onLogoff, onLogoff )

    def onFailure( reason ):
        print "Login failed"
        print reason.getTraceback()

    df.addCallbacks( onLogin, onFailure )
    return df

if __name__ == "__main__":
    reactor.callWhenRunning( main )
    reactor.run(installSignalHandlers=0)
    print "runned the first time"

    reactor.callWhenRunning( main )
    reactor.run(installSignalHandlers=0)
    print "will never reach this point"

Я упростил код - он ничего не делает, чем вход в систему + выход из системы снова. Это никогда не будет отвечать от второго reactor.run () на звонок.

Как это сделано правильно? Я застреваю здесь - заранее спасибо.

С наилучшими пожеланиями, Florian.

6
задан Florian Lagg 30 December 2009 в 08:58
поделиться

4 ответа

Написать , контроль за сервером или контроль за расширителем asp.net как набор инструментов контроля Аякса делают.

Лучшее, что вы можете сделать, это загрузить источник AjaxControlToolkit из CodePlex и изучить источник ModalPopup в этом.

-121--3723861-

Если вы установили AnkhSVN или StartSVN , решить эту проблему, скорее всего, будет так же просто, как щелчок правой кнопкой мыши на файле в обозревателе решений и выбор изменения конфликта.

Измененный файл будет открыт в редакторе слияния. (См. Инструменты - > Опции - > Управление версиями - > Инструменты пользователя Subversion для AnkhSVN). С хорошим инструментом слияния, таким как свободно использовать SourceGear DiffMerge или TortoureMerge, разрешение конфликта всего несколько мышек.

-121--1123726-

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

Вот краткое описание того, что я узнал.

Во-первых, вкратце - проблемы, которые у меня были с закрученными:

  1. Я не понимал асинхронных основ закрученных. Я использовал что-то подобное в gui-фреймворках, но давно не видел пользы.
  2. Во-вторых, я пытался придумать синхронный вызов цикла событий несколько раз. Это было необходимо, потому что я не могу одновременно использовать более одной исходящей факсимильной линии. Поскольку цикл скрученных событий не может быть перезапущен, это невозможно. Как я мог бы прочитать в документах «deferToThread» может помочь мне здесь, но я думаю, что это не лучшее решение.

В моей концепции я решил эти проблемы:

  • Использование defer.DeferredSemaphore () , что позволяет мне ограничить параллелизм 1. Я нашел пример здесь: http://oubiwann.blogspot.com/2008/06/async-batching-with-twisted-walkthrough.html
  • звонить скрученные anynchronically и позволить Дефереды сделать работу (отправить факс)
  • Запись статуса факса в базу данных и отправка почты квитанции вызывается от Дефередов

Мне нужно много переосмысления, но как только вы его получите, это выглядит очень легко.

Спасибо Ини и Жан-Полю Кальдероне за вашу помощь.

3
ответ дан 8 December 2019 в 16:03
поделиться

Как и было сказано iny, вам нужно все сделать одним вызовом на reactor.run и reactor.stop.

Если мы рассмотрим размещенный вами код примера, то увидим, что он выполняет следующие шаги:

  1. Запустить реактор.
    • Подключиться, послать факс, отключить
    • Остановить реактор
    • Запустить реактор
    • Подключиться, послать факс, отключить
    • Остановить реактор

Если мы удалим только шаги 3 и 4, то программа на самом деле будет делать вполне разумную вещь.

Вот как вы реализовали шаг 3:

def onLogoff( result ):
    print "Logoff erfolgt"
    reactor.stop()

Это вызвало возврат первого обращения к reactor.run, расчищая путь для реализации шага 4:

reactor.callWhenRunning( main )
reactor.run(installSignalHandlers=0)

Итак, общая идея здесь заключается в том, чтобы перескочить прямо к шагу 5 вместо того, чтобы делать шаги 3 и 4. Рассмотрим, что может произойти, если вы переопределите onLogoff следующим образом:

def onLogoff( result ):
    print "Logoff erfolgt"
    main()

и удалите последние три строки вашего примера. На самом деле это даст Вам бесконечный цикл, так как та же самая onLogoff работает после 2-го отключения и начинает 3-е соединение. Однако, Вы можете исправить это с помощью параметра в функции main для управления поведением перезапуска.

Как только это станет логичным, Вы можете подумать о переносе выхода из функции main и обратном вызове, определенном в блоке __main__. Это большая часть мощности Deferreds: она позволяет сохранять правильное разделение между реализацией источника события (в данном случае, вашей функции отправки факса) и кодом для обработки результирующих событий (отправка второго факса, или выход из, в данном случае).

.
9
ответ дан 8 December 2019 в 16:03
поделиться

Невозможно перезапустить реактор. Другими словами, вы можете вызвать reactor.run() только один раз.

Вместо этого можно сделать все, что нужно за один запуск реактора.

3
ответ дан 8 December 2019 в 16:03
поделиться

Если вы все еще ищете решение ... У меня была такая же проблема. У меня есть сценарий, который использует Twisted для выполнения программы на удаленном сервере. Мне нужен был способ синхронного запуска этого скрипта из приложения django. В итоге я заставил свой сценарий Twisted вызывать удаленный сервер и просто печатать на стандартный вывод. Затем из моего приложения Django я выполнил этот скрипт через subprocess.Popen и установил stdout = PIPE, чтобы я мог захватить вывод моего Twisted скрипта и использовать его в своем приложении Django.

Это не совсем идеальный вариант и в значительной степени противоречит цели Twisted, но это позволяет преодолеть «невозможность вызвать response.run () во второй раз, поскольку сценарий Twisted каждый раз запускается в своем собственном процессе». .

Это действительно отлично сработало для меня, и это звучит очень похоже на ту же ситуацию, в которой вы находитесь. Надеюсь, это поможет. Удачи. (Я могу опубликовать несколько примеров кода, если вы думаете, что это поможет, просто дайте мне знать).

0
ответ дан 8 December 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: