2012-11-20 2 views
6

대홍수에 사용할 작은 스크립트를 작성하고 있습니다. 대홍수는 Twisted를 사용합니다. 실제로 작동하는 방법에 대해서는 확고하게 파악하지 못했습니다. 일반적으로 나는 더 많은 정보를 찾아 볼 것이지만, Twisted로 시작하는 것은 길어서 시간이 걸리며이 작은 프로젝트의 범위를 벗어납니다. 그래서 나는 여기서 물어볼 것이라고 생각했습니다.트위스트 반응기가 정지되었지만 프로그램이 종료되지 않습니까?

이제이 코드가 있습니다. 나는 급류가 성공적으로 추가되면, 그것은) (시작으로 돌아 가야한다

import base64 

import processargs 

from deluge.ui.client import client 
from twisted.internet import reactor 

from deluge.log import setupLogger 
setupLogger() 

options = processargs.readConfig(os.path.expanduser("~/.deluge-automator")) 

d = client.connect(
    host=options['host'], 
    port=int(options['port']), 
    username=options['username'], 
    password=options['password'] 
) 

def start(): 
    #other code 

    t = client.core.add_torrent_file(tfile, 
            base64.encodestring(data), None) 

    t.addCallback(on_torrent_added_success, tfile) 
    t.addErrback(on_torrent_added_fail) 


def handle_stop_signal(SIGNAL, stack): 
    client.disconnect() 
    reactor.stop() 


def on_torrent_added_success(result, tfile): 
    #other code 
    start() 


def on_torrent_added_fail(result): 
    print "Add torrent failed!" 
    print "result: ", result 


def on_connect_success(result): 
    #other code 
    start() 


d.addCallback(on_connect_success) 


def on_connect_fail(result): 
    print "Connection failed!" 
    print "result: ", result 


d.addErrback(on_connect_fail) 

signal.signal(signal.SIGTERM, handle_stop_signal) 
signal.signal(signal.SIGINT, handle_stop_signal) 

reactor.run() 

도움이 필요한 specifig 부분을 설명하려고합니다, 그것은 않지만, 나는 그것이 반응기 또는 무언가를 잃는 생각합니다.

± % python2 main.py 
Connection was successful! 
result: 10 
^C^CConnection failed! 
result: [Failure instance: Traceback: <class 'twisted.internet.error.ReactorNotRunning'>: Can't stop reactor that isn't running. 
/usr/lib/python2.7/site-packages/twisted/internet/defer.py:551:_runCallbacks 
/usr/lib/python2.7/site-packages/deluge/ui/client.py:412:__on_login 
/usr/lib/python2.7/site-packages/twisted/internet/defer.py:368:callback 
/usr/lib/python2.7/site-packages/twisted/internet/defer.py:464:_startRunCallbacks 
--- <exception caught here> --- 
/usr/lib/python2.7/site-packages/twisted/internet/defer.py:551:_runCallbacks 
main.py:70:on_connect_success 
main.py:32:start 
main.py:49:handle_stop_signal 
/usr/lib/python2.7/site-packages/twisted/internet/base.py:577:stop 
] 

그래서 원자로가 정지됩니다하지만 프로그램을 종료하지 않습니다 지금은 SIGTERM 또는 SIGINT, 원자로 폐쇄를 접수에 있지만, 프로그램을 종료하지 않을 때마다 때문에. 나는 키보드 인터럽트를 두 번해야한다. 일단 반응기를 멈추고 두 번째로 오류를 던집니다. 이 같은 루프를 설정하는 특정 방법이 있습니까?

답변

8

반응기는 sigint, sigterm 자체를 처리합니다 (이를 비활성화하는 reactor.run() 매개 변수가있을 수 있습니다). 대신 reactor.addSystemEventTrigger('before', 'shutdown', client.disconnect)을 설치하십시오.

twisted: catch keyboardinterrupt and shutdown properly을 참조하십시오.

+2

신호 처리기 내에서 Twisted API를 호출하는 것이 안전하지 않다는 것을 추가하고 싶습니다. 신호 처리기는 선제 문맥 전환의 한 형태이며 스레드와 마찬가지로 안전하지 않으므로 신중하게 처리해야합니다. thread-safe로 표시된 Twisted API만이 시그널 핸들러에서 사용될 수 있습니다 (가장 흥미로운 것은'reactor.callFromThread'입니다). –

+0

완벽하게 작동합니다. – mrobinson7627

관련 문제