我正在使用if
语句来决定是否要发起{{1}}。但是在支票运行之前它已经被解雇了。从输出中看,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()
答案 0 :(得分:4)
我发现当Twisted端点(在本例中为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
答案 1 :(得分:1)
请注意输出:
...
main3.printerCallback() - 1426884127.26
...
回到main
,我们看到printerCallback是burrow.defer
的回调。我们知道它正在运行,因为它的输出是打印的。所以你应该找出谁在调用它。一种方法是在printerCallback中引发异常,即
def printerCallback(proto):
print('main3.printerCallback() - %s ' % str(time.time()))
raise Exception
如果您需要更具体地跟踪跟踪,可以使用inspect模块。