2015-07-14 4 views
1

Я ищу способ получить материал от обратного вызова в генератор,
или генератор для наследования обратного вызова.Генератор как обратный вызов

При вызове обратного вызова генератор должен работать, 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. 

В то время как я обычно использовал бы очередь и поток для запуска и получить эту функцию обратного вызова, в этом случае я бег внутри расширения питонов в кли, которое вызывает my_callback(data).
В результате I не может использовать threading, поскольку python выполнит только этот обратный вызов. Впоследствии C-часть cli снова сделает материал, а python не будет выполнен.

Редактировать: Я мог бы зарегистрировать функцию 'poll', которая будет вызываться периодически. Положив ожидание, дайте хотя бы конструкцию очереди нитей выполнить некоторое время. Но это кажется грязным для реального кода.

+0

Выполняет ли обратный вызов один или несколько (подает генератор *). Вы хотите что-нибудь сделать? Если вы используете сопрограмму вместо генератора, вы отправляете данные на нее, и она может давать данные или отправлять их другой сопрограмме. Я попытаюсь взломать пример, но вы должны посмотреть: http://pyvideo.org/video/213/pycon-2009--a-curious-course-on-coroutines-and-co (это слишком долго, но стоит его), слайды и файлы находятся по адресу http://www.dabeaz.com/coroutines/ – wwii

+0

... Не помните это видео, а в описании: '' 'inlining callback functions''': http://pyvideo.org/video/2575/generators-the-final-frontier – wwii

ответ

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 исключение ,

Смежные вопросы