是什么导致我的延迟触发,除了添加回调、启动反应器和连接端点之外什么都没做?

2024-04-28 22:43:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用一个if-语句来决定是否触发一个Deferred。不过,它在检查运行之前就已经启动了。从输出来看,Deferred在运行reactor.run()时立即启动。不一定要触发回调才能发生这种情况吗?你知道吗

相关代码段:

class OutpostBurrowNew(amp.AMP, Protocol):
    protocol = OutpostGopher
    ...
    def rfidTest(self):
        print('Checking for tag - Deferred called: %s' % str(self.defer.called))
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        if status == MIFAREReader.MI_OK:
            status,uid = self.verify_card()
            cardid = '-'.join([str(x) for x in uid])
            print('Card detected: %s' % str(cardid))
            self.defer.callback()

def main3():
    ''' main3() is for testing reactor usage of RFID-card reading '''
    burrow = OutpostBurrowNew('client')
    burrow.protocol = OutpostGopher
    burrow.connectEndpoint()  # A deferred is created, set on burrow.defer
    def printerCallback(proto):
        # This gets passed the OutpostGopher protocol
        print('main3.printerCallback() - %s ' % str(time.time()))
    burrow.defer.addCallback(printerCallback)
    looper = LoopingCall(burrow.rfidTest)
    loopdefer = looper.start(1, now=False)
    print('Deferred just created, status: %s' % str(burrow.defer.called))
    reactor.run()

输出:

(env)pi@raspi ~/zenithproject/zenith $ sudo python indev/rfidread_remote.py 
Deferred just created, status: False
Gopher.connectionMade() called.
main3.printerCallback() - 1426884127.26
Checking tag - Deferred called: True
Checking tag - Deferred called: True
Checking tag - Deferred called: True
^CCtrl+C captured, ending read.

Tags: selftagstatusprotocoldeferreactorprintchecking
2条回答

我发现当一个扭曲的端点(在本例中是TCP4ClientEndpoint)连接到另一个端点(这里是TCP4ServerEndpoint)时,由该连接创建的Deferred会立即被触发(即连接时自动调用Protocol.connectionMade())。你知道吗

这是通过在Deferred需要被激发之前不建立连接来解决的(或者,我想我可以创建另一个Deferred来使用),如下所示:

class OutpostBurrowNew(amp.AMP, Protocol):
    protocol = OutpostGopher
    #...
    def rfidTest(self):
        #print("Checking tag - Deferred called: %s" % str(self.defer.called))
        print('Tag check')
        (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
        if status == MIFAREReader.MI_OK:
            # print "Card detected"
            status,uid = self.verifyCard()
            cardid = '-'.join([str(x) for x in uid])
            print('Card detected: %s' % str(cardid))
            #self.defer.callback()
            self.connectEndpoint()

def main3():
    ''' main3() is for testing reactor usage of RFID-card reading '''
    burrow = OutpostBurrowNew('client')
    burrow.protocol = OutpostGopher
    #burrow.connectEndpoint()  # A deferred is created, set on burrow.defer
    looper = LoopingCall(burrow.rfidTest)
    loopdef = looper.start(1, now=False)
    reactor.run()

结果如下:

(env)pi@raspi ~/zenithproject/zenith $ sudo python indev/rfidread_remote.py 
Tag check
Tag check
Card detected: 133-197-223-29-130
Gopher.connectionMade() called.
Tag check
Tag check

注意输出:

...
main3.printerCallback() - 1426884127.26
...

回到main,我们看到printerCallback是burrow.defer的回调。我们知道它正在运行,因为它的输出是打印出来的。所以你应该找出谁在叫它。一种方法是在printerCallback中引发异常,即

def printerCallback(proto):
    print('main3.printerCallback() - %s ' % str(time.time()))
    raise Exception

如果需要更具体地使用跟踪,可以使用inspect模块。你知道吗

相关问题 更多 >