Jadi saya sedang menulis skrip kecil untuk digunakan dengan Deluge. Deluge menggunakan Twisted, dan saya benar-benar tidak begitu paham cara kerjanya. Biasanya saya hanya mencari info lebih lanjut tentangnya, namun memulai dengan Twisted akan memakan waktu lama dan berada di luar cakupan proyek kecil ini. Jadi kupikir aku akan bertanya di sini saja.
Sekarang, saya punya kode ini. Saya akan mencoba menjelaskan bagian-bagian tertentu yang memerlukan bantuan
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()
Ketika torrent berhasil ditambahkan, ia harus kembali ke start(), dan memang demikian, tapi menurut saya ia kehilangan reaktor atau semacamnya. Karena sekarang setiap kali ia menerima SIGTERM atau SIGINT, reaktor akan menutup, namun tidak menghentikan program:
± % 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
]
Jadi reaktornya dihentikan, tapi tidak menghentikan programnya. Saya harus menginterupsi keyboard dua kali. Sekali untuk menghentikan reaktor, dan kedua kalinya untuk melakukan kesalahan. Apakah ada cara tertentu untuk mengatur loop seperti ini?