扭曲的竞争条件

时间:2014-03-07 19:24:32

标签: python twisted

我的剧本中存在竞争条件问题。目标是连接到Deluge并使用Twisted收集信息。

这是脚本:

#!/usr/bin/python

import json
import sys
import os.path
from datetime import datetime

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

class Deluge(object):
    def __init__(self,*args):
        for key, value in enumerate(args):
            self.key = value

    def getDownloadQueue(self):
        print "Started getDownloadQueue()"
        self.connect()
        print "Finished getDownloadQueue()"

    def connect(self):
        print "Started connect()"
        deluge = client.connect()

        #deluge.addCallback(self.onConnect,params).addErrback(self.onConnectFail).addBoth(self.disconnect)

        print "task.react()"
        test = task.react(self.onConnect, [])
        print "deluge.addCallback()"
        test.addCallback(deluge).addErrback(self.onConnectFail).addBoth(self.disconnect)
        #deluge.addErrback(self.onConnectFail)
        print "Finished connect()"

    def disconnect(self):
        client.disconnect()
        print "Finished disconnect()"

    def onConnect(self, reactor):
        print "Started onConnect()"
        def onGetTorrentStatus(torrentInfo):
            print "Started onGetTorrentStatus()"
            print torrentInfo["name"] + " " + torrentInfo["label"]
            if torrent["name"] == torrent_name:
                print "File '%s' already exists" % torrent["name"]
            print "Finished onGetTorrentStatus()"
            return

        def onGetSessionState(torrent_ids):
            print "Started onGetSessionState()"
            print torrent_ids

            print "Got all torrent ids"
            for id in torrent_ids:
                d = client.core.get_torrent_status(id, ["name","label"]).addCallback(onGetTorrentStatus)
            print defer.gatherResults([d, self.disconnect])
            print "Finished onGetSessionState()"

        client.core.get_session_state().addCallback(self.onGetSessionState)
        print "Finished onConnect()"

    def onConnectFail(self,result):
        print "Error: %s" % result

Deluge().getDownloadQueue()

这是输出的错误:

Traceback (most recent call last):
  File "./delugeTest.py", line 64, in <module>
    Deluge().getDownloadQueue()
  File "./delugeTest.py", line 18, in getDownloadQueue
    self.connect()
  File "./delugeTest.py", line 28, in connect
    test = task.react(self.onConnect, [])
  File "/usr/local/lib/python2.7/dist-packages/twisted/internet/task.py", line 867, in react
    finished = main(_reactor, *argv)
  File "./delugeTest.py", line 58, in onConnect
    client.core.get_session_state().addCallback(self.onGetSessionState)
  File "/usr/lib/python2.7/dist-packages/deluge/ui/client.py", line 504, in __call__
    return self.daemon.call(self.base, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/deluge/ui/client.py", line 308, in call
    self.protocol.send_request(request)
AttributeError: 'NoneType' object has no attribute 'send_request'

这是参考我几个月前提出的一个问题:How to properly stop Twisted reactor when callback is finished

0 个答案:

没有答案