2012-11-20 10 views
6

तो मैं डेल्यूज के साथ उपयोग करने के लिए एक छोटी लिपि लिख रहा हूं। डिल्यूज ट्विस्ट का उपयोग करता है, और मुझे वास्तव में यह समझ में नहीं आता कि यह कैसे काम करता है। आम तौर पर मैं बस इसके बारे में अधिक जानकारी देखता हूं, लेकिन ट्विस्ट के साथ शुरू करने से लंबा समय लगेगा और इस छोटी परियोजना के दायरे से बाहर है। तो मैंने सोचा कि मैं बस यहां पूछूंगा।घुमावदार रिएक्टर बंद कर दिया गया है, लेकिन कार्यक्रम खत्म नहीं होता है?

अब, मेरे पास यह कोड है। मैं specifig भागों मैं के साथ

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() 

जब एक धार को सफलतापूर्वक जोड़ रहा है, यह (शुरू करने के लिए) के लिए वापस जाना चाहिए मदद की जरूरत समझाने की कोशिश करेंगे, और यह करता है, लेकिन मैं इसे रिएक्टर या कुछ खो देता है लगता है।

± % 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

रिएक्टर स्वयं सिग्ंट संभालता है, सिगरेट स्वयं (reactor.run() का पैरामीटर हो सकता है जो इसे अक्षम करता है)। इसके बजाए reactor.addSystemEventTrigger('before', 'shutdown', client.disconnect) इंस्टॉल करें।

twisted: catch keyboardinterrupt and shutdown properly देखें।

+2

बस उसमें जोड़ना चाहते हैं कि सिग्नल हैंडलर के अंदर ट्विस्ट एपीआई को कॉल करने के लिए यह सुरक्षित नहीं है *। सिग्नल हैंडलर प्रीपेप्टिव संदर्भ स्विचिंग का एक रूप हैं, वे धागे के रूप में असुरक्षित हैं और सावधानी से इलाज किया जाना चाहिए। थ्रेड-सुरक्षित के रूप में चिह्नित केवल ट्विस्ट एपीआई सिग्नल हैंडलर में उपयोग किए जा सकते हैं (जिनमें से सबसे दिलचस्प 'reactor.callFromThread') है। –

+0

पूरी तरह से काम करता है, बहुत बहुत धन्यवाद! – mrobinson7627

संबंधित मुद्दे