在inlineCallbacks函数内回调

时间:2011-06-09 04:09:16

标签: python callback twisted yield

假设我有这样的功能:

def display(this, that):
    print this, that

和一个班级:

class Runner(object):
    def __init__(self, callback):
        self.callback = callback
        self.loop = twisted.internet.task.LoopingCall(repeat)
        self.loop.start(0)

    @defer.inlineCallbacks
    def repeat(self):
        this = yield do_this()
        that = yield do_that()

        if this and that:
            # now I want to call the callback function
            yield self.callback(this, that) # makes sense?

runner = Runner(display)
reactor.run()

基本上我想要做的是我想创建一个Runner类,它将执行一些特定的任务,每次获得结果时,它都会调用给定的回调函数。我想创建一个只执行一件事的泛型类,而不是创建一个执行特定事物的新函数。 E.g:

class TwitterReader(object):
    def __init__(self, callback):
        ...
        ...

    @defer.inlineCallbacks
    def get_messages(self):
        ...
        ...
        yield callback(messages)

class MessageFilter(object):
    def __init__(self):
        self.bad_messages = open('bad_messages.txt', 'w')
        self.twitter = TwitterReader(self.message_received)

    def message_received(messages):
        for message in messages:
            for bad_word in BAD_WORDS:
                if bad_word in message:
                    self.bad_messages.write(message)
                    break

我是新来的扭曲。所以,我不确定这是否是正确的方法。是吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您的问题是callback内的repeat应该是self.callback

除此之外,你的例子应该完全按照书面形式工作。

答案 1 :(得分:0)

如果它返回延迟并且您希望在退出yield self.callback函数之前等待结果,那么需要repeat。在您的示例中,您的回调是一个正常函数(它有效地返回None),因此屈服没有优势 - 但是允许它产生非延迟值,因此不会造成任何伤害。来自inlineCallbacks docs

  

非延期的东西也可能会产生,而你的发电机也会产生   将被发回的同一对象恢复。这意味着产量   执行大致相当于maybeDeferred的操作。

如果您的回调 返回延迟(例如,如果它也是inlineCallbacks修饰函数),则屈服将暂停执行repeat,直到延迟完成。在您的申请中,这可能是也可能不是。