生成器作为回调

时间:2015-07-14 01:56:23

标签: python callback generator

我正在寻找一种方法将回调中的东西送入发电机,
或者继承回调的生成器。

调用回调时,生成器应该运行yield数据。

def my_callback(some_data):
    my_generator.execute(some_data)  # what to do?

def my_generator():
    while True:
        yield some_data  # from my_callback

 # main program
 for x in my_generator:
     print(x)

# This is pseudo python code.

虽然我通常会使用队列和线程来运行并获得该回调,但在这种情况下,我在cli的python扩展中运行,调用my_callback(data)
因此,我无法使用线程,因为python只会执行该回调。 之后,cli的C部分将再次执行,并且不会执行python。

修改:我可以注册'民意调查'函数,将定期调用。在那里等待至少给线程队列构造一些时间来执行。但是对于实际的代码来说,这感觉很脏。

1 个答案:

答案 0 :(得分:0)

回调可以将数据发送到协同程序,如果需要,可以再次发送它。 不确定这是否是您正在寻找的,但您的问题让我想到了协同程序。

def my_callback(some_data):
    cr.send(some_data)  # what to do?

def my_coroutine(target):
    n = 0
    while True:
        data = (yield)  # from my_callback
        print 'my_callback sent: {}'.format(data)
        target.send(data)  # to my_printer

def my_printer(prefix):
    while True:
        s = (yield) # from my_coroutine
        print prefix + s

mp = my_printer('\t\t\t')
mp.next()   # advance to the first yield
cr = my_coroutine(mp)
cr.next()   # advance to the first yield

my_callback('foo')
for n in xrange(3):
    my_callback('foo' + str(n))

cr.close()
mp.close()

>>> 
my_callback sent: foo
            foo
my_callback sent: foo0
            foo0
my_callback sent: foo1
            foo1
my_callback sent: foo2
            foo2
>>> 

如果回调执行是异步的,我不确定如果协程不是回到第一个yield并且回调试图发送它的话会发生什么,它可能会抛出ValueError: generator already executing例外。