Я хочу использовать скрученный (и 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.
Написать , контроль за сервером или контроль за расширителем asp.net как набор инструментов контроля Аякса делают.
Лучшее, что вы можете сделать, это загрузить источник AjaxControlToolkit из CodePlex и изучить источник ModalPopup в этом.
-121--3723861-Если вы установили AnkhSVN или StartSVN , решить эту проблему, скорее всего, будет так же просто, как щелчок правой кнопкой мыши на файле в обозревателе решений и выбор изменения конфликта.
Измененный файл будет открыт в редакторе слияния. (См. Инструменты - > Опции - > Управление версиями - > Инструменты пользователя Subversion для AnkhSVN). С хорошим инструментом слияния, таким как свободно использовать SourceGear DiffMerge или TortoureMerge, разрешение конфликта всего несколько мышек.
-121--1123726-Спасибо за ваши ответы, я не реализовал решение сейчас, но я знаю, как я мог бы сделать это сейчас...
Вот краткое описание того, что я узнал.
Во-первых, вкратце - проблемы, которые у меня были с закрученными:
В моей концепции я решил эти проблемы:
Мне нужно много переосмысления, но как только вы его получите, это выглядит очень легко.
Спасибо Ини и Жан-Полю Кальдероне за вашу помощь.
Как и было сказано iny, вам нужно все сделать одним вызовом на reactor.run
и reactor.stop
.
Если мы рассмотрим размещенный вами код примера, то увидим, что он выполняет следующие шаги:
Если мы удалим только шаги 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: она позволяет сохранять правильное разделение между реализацией источника события (в данном случае, вашей функции отправки факса) и кодом для обработки результирующих событий (отправка второго факса, или выход из, в данном случае).
Невозможно перезапустить реактор. Другими словами, вы можете вызвать reactor.run() только один раз.
Вместо этого можно сделать все, что нужно за один запуск реактора.
Если вы все еще ищете решение ... У меня была такая же проблема. У меня есть сценарий, который использует Twisted для выполнения программы на удаленном сервере. Мне нужен был способ синхронного запуска этого скрипта из приложения django. В итоге я заставил свой сценарий Twisted вызывать удаленный сервер и просто печатать на стандартный вывод. Затем из моего приложения Django я выполнил этот скрипт через subprocess.Popen и установил stdout = PIPE, чтобы я мог захватить вывод моего Twisted скрипта и использовать его в своем приложении Django.
Это не совсем идеальный вариант и в значительной степени противоречит цели Twisted, но это позволяет преодолеть «невозможность вызвать response.run () во второй раз, поскольку сценарий Twisted каждый раз запускается в своем собственном процессе». .
Это действительно отлично сработало для меня, и это звучит очень похоже на ту же ситуацию, в которой вы находитесь. Надеюсь, это поможет. Удачи. (Я могу опубликовать несколько примеров кода, если вы думаете, что это поможет, просто дайте мне знать).