【问题标题】:Generator as Callback生成器作为回调
【发布时间】:2015-07-14 01:56:22
【问题描述】:

我正在寻找一种将回调中的内容获取到生成器中的方法,
或生成器继承回调。

当回调被调用时,生成器应该运行,yielding 数据。

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.

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

编辑:我可以注册一个'poll'函数,它会被定期调用。在那里等待至少给线程队列构造一些时间来执行。但这对于实际代码来说感觉很脏。

【问题讨论】:

  • 回调执行一次还是多次(馈送生成器)。你想制作某种管道吗?如果您使用协程而不是生成器,您可以向它发送数据,它可以产生数据或将其发送到另一个协程。我会尝试举一个例子,但是,你应该看 - pyvideo.org/video/213/…(它很长但值得),幻灯片和文件位于dabeaz.com/coroutines
  • ...不记得这个视频,但在描述中:```内联回调函数```:pyvideo.org/video/2575/generators-the-final-frontier

标签: python callback generator


【解决方案1】:

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

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 异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 2018-07-09
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2013-05-17
    相关资源
    最近更新 更多