필자는 Twisted/PyQt 응용 프로그램을 가지고 있으며 다른 응용 프로그램들도 원격 자원에 연결되어 있습니다. 사용자가 창을 닫았을 때 가능한 경우 모든 연결을 셧다운하고 싶습니다. 그렇지 않으면 강제로 종료합니다.Twisted + qtreactor : 마지막 창을 닫은 후 정리하는 방법?
문제는 내가 연결부를 닫을 때까지는 반응기가 더 이상 나를 그렇게하도록 살아 있지 않다는 것입니다.
여기 내 응용 프로그램 코드가 없습니다 :
# Create app and connect the Twisted/Qt reactors
app = QApplication(sys.argv)
qtreactor.qt4reactor.install()
# Shutdown Twisted when window is closed
@defer.inlineCallbacks
def stop():
print "="*40, "Closing connections..."
yield closeConnections()
print "="*40, "closed."
print "="*40, "Stopping reactor..."
reactor.stop()
print "="*40, "stopped."
app.connect(app, SIGNAL("lastWindowClosed()"), stop)
reactor.runReturn()
rc = app.exec_()
exit(rc)
그리고 여기 내 정리 코드의 버전을 박탈이다 : 첫 번째 인쇄 문에 도달
@defer.inlineCallbacks
def closeConnections():
for connection in connections:
print "Closing connection #%s" % connection
yield threads.deferToThread(popen("/foo/bar/cleanup %s" % connection))
print "Connection closed."
하고, 명령이 실행됩니다,하지만 결코 두 번째를 얻거나 for 루프를 여러 번 통과하지 마십시오.
내 분석이 맞습니까? 원자로가 이미 내려져있어 문제가 발생하지 않으므로 threads.deferToThread에서 다시는 듣지 못합니까? 아니면 다른 문제가 있습니까? 또한 어떻게 수정합니까?
덕분에, 조나단
폴 : 죄송합니다. 내 popen (...)은 실제 코드가 아닙니다. 필자는 원격 클라이언트를 시작하기위한 쉘 명령과 TCP 클라이언트와 상호 작용하는 TCP 연결의 조합 인보다 복잡한 연결 메커니즘을 가지고 있습니다. 나는 세부 사항을 가지고 나의 예제를 복잡하게하지 않기를 선택했고, 이렇게함으로써 나의 closeConnection() 코드가 잘못되었다. 내 잘못이야. 감사합니다. 'reactor.addSystemEventTrigger ('before', 'shutdown', stop) '을 사용하도록 변경하면 매력처럼 작동합니다. 콜백을 할 때 원자로가 아직 살아 있고 예상대로 작동합니다. – Jonathan
또한 버그를 발견했습니다. 위의 작업을 수행하면 원자로가 정지되지만 프로그램이 종료되지 않습니다. 'reactor.stop()'을 호출하면 qtreactor는'reactor.threadpool.stop()'을 호출하지 않고 ThreadPool 쓰레드는'threading.enumerate()'와 같이 실행 중임을 알 수 있습니다. 그런 다음 수동으로'reactor.threadpool.stop()'을 호출하면 프로그램이 종료됩니다. qtreactor의 stop()이이를 처리해야합니다. 이 문제에 대한 버그 보고서를 제출해야합니까? 그렇다면 어디에서? DeferToThread는 (내가하는 것처럼) 차단하고있는 레거시 라이브러리 코드와 상호 작용할 수있는 좋은 방법입니다. 따라서이 기능은 내가 할 수 있거나 할 수없는 기능이 아닙니다. – Jonathan
PySide 기반 Qt 원자로가 한 가지 시도해보십시오. 우리는 PySide 라이센스가 호환 가능하기 때문에 (PyQt 라이센스가 아닌) Twisted에 다시 통합하려고합니다. 해당 원자로가 문제를 나타내면 http://twistedmatrix.com/trac/ticket/3977에 티켓을 남기거나 의견을 남기십시오. –