我正在寻找一种方法将回调中的东西送入发电机,
或者继承回调的生成器。
调用回调时,生成器应该运行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。
修改:我可以注册'民意调查'函数,将定期调用。在那里等待至少给线程队列构造一些时间来执行。但是对于实际的代码来说,这感觉很脏。
答案 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
例外。