1

私はツイストとパイソンが初めてで、ツイストパイソンを読んでいます。

通話の登録

reactor.callLater(_interval, self.count, *args)

Countdown クラスを作成しました。これには count 関数が含まれています。3 回呼び出しています。

reactor.callWhenRunning(Countdown().count, 1)
reactor.callWhenRunning(Countdown().count, 2)
reactor.callWhenRunning(Countdown().count, 3)

時間間隔が異なり、すべての呼び出しが終了したらリアクターを停止する必要があります。したがって、ねじれた API には、すべての呼び出しが完了したことを知るためのメソッドがあります。

私のコードは

class Countdown(object):

    counter = 5

    def count(self, *args):
    _interval = args[0]
        name = args[1]
        if self.counter == 0 and name == "Third Call":
            reactor.stop()
        elif self.counter == 0:
        print name, " Finished..!"
        else:
            print self.counter, '...'
            self.counter -= 1
            reactor.callLater(_interval, self.count, *args)

from twisted.internet import reactor

reactor.callWhenRunning(Countdown().count, 1, "First Call")
reactor.callWhenRunning(Countdown().count, 2, "Second Call")
reactor.callWhenRunning(Countdown().count, 3, "Third Call")

print 'Start!'
reactor.run()
print 'Stop!'

今、私は if self.counter == 0 and name == "Third Call": を使用して、すべてのカウンタープロセスが終了するのを防ぎます。だから今私が知る必要があるのは、すべての呼び出しが終了したか、すべてのカウンター呼び出しが終了したかを知るためのメソッドが組み込まれているツイストがあるかどうかです。

4

3 に答える 3

1

Twisted には、イベントのリストを操作するための API があります: DeferredList http://twistedmatrix.com/documents/current/core/howto/defer.html#auto8

これがどのように機能するかの小さな例を次に示します。

from twisted.internet import defer 
from twisted.internet import reactor


def delayedFunction(dF):
    print('I was called')
    dF.success(True)

class Counter(object):
    def timeOffsetExecute(self,delay):
        dF = defer.Deferred()
        reactor.callLater(delay,delayedFunction,dF)
        return dF

def onAllResult(val):
    print 'All delayed functions called'
    reactor.stop()

cp = Counter()

dl = defer.DeferredList([cp.timeOffsetExecute(1), cp.timeOffsetExecute(3), cp.timeOffsetExecute(9)], consumeErrors=True)
dl.addCallback(onAllResult)

reactor.run()
于 2012-12-05T14:36:31.253 に答える
0

私の見解:

class Countdown(object):

counter1 = 5
counter2 = 20
counter3 = 50

def count1(self):
    if self.counter1 == 0 and self.counter2 == 0 and self.counter3 == 0:
        reactor.stop()
    elif self.counter1 > 0:
        print self.counter1, '... process',1
        self.counter1 -= 1
        reactor.callLater(0.1, self.count1)

def count2(self):
    if self.counter1 == 0 and self.counter2 == 0 and self.counter3 == 0:
        reactor.stop()
    elif self.counter2 > 0:
        print self.counter2, '... process',2
        self.counter2 -= 1.25
        reactor.callLater(0.12, self.count2)

def count3(self):
    if self.counter1 == 0 and self.counter2 == 0 and self.counter3 == 0:
        reactor.stop()
    elif self.counter3 > 0:
        print self.counter3, '... process',3
        self.counter3 -= 12.5
        reactor.callLater(0.2345, self.count3)

from twisted.internet import reactor

obj = Countdown()
reactor.callWhenRunning(obj.count1)
reactor.callWhenRunning(obj.count2)
reactor.callWhenRunning(obj.count3)

print 'Start!'
reactor.run()
print 'Stop!'

ここでは、遅延メソッド ソリューションは使用していません。

于 2016-12-28T17:23:35.003 に答える