Turning a callback function into a generator

Kirk McDonald kirklin.mcdonald at gmail.com
Mon Jul 3 13:36:44 EDT 2006


Alex Martelli wrote:
> Lawrence D'Oliveiro <ldo at geek-central.gen.new_zealand> wrote:
> 
> 
>>In article <44a89559 at nntp0.pdx.net>,
>> Kirk McDonald <kirklin.mcdonald at gmail.com> wrote:
>>
>>
>>>I want to somehow, in some way, provide an iteration interface to this
>>>function. Thoughts?
>>
>>Run it in a separate thread/process?
> 
> 
> Sounds best to me.  Specifically, given (e.g.) something like the OP's
> 
> def func(callback):
>      for i in [1, 2, 3, 4, 5]:
>          callback(i)
> 
> we might have a wrapper such as:
> 
> import thread
> import Queue
> 
> def wrap_cb_into_gen(func):
>     q = Queue.Queue(1)           # maximum size of 1
>     def callback(item):
>         q.put(item)
>     all_done_sentinel = object()
>     def thread_skeleton():
>         func(callback)
>         q.put(all_done_sentinel)
>     thread.start_new_thread(thread_skeleton, ())
>     while True:
>         item = q.get()
>         if item is all_done_sentinel: break
>         yield item
> 
> 
> Of course, there are lighter-weight options than a length-1 Queue for
> the purpose of synchronizing these two threads, but I always tend to
> prefer Queue (for its simplicity, generality, solidity) to other
> synchronization structures and architectures, unless there is some very
> strong reason to do otherwise in a specific case.  Also, I normally use
> module threading rather than the lower-level module thread -- here,
> clearly, either one will do just fine.
> 
> 
> Alex

Threads are probably a weak point of mine. I have little experience with 
them, and so I am inclined to paranoia while using them. What 
implications does this have for "func"? In my case, it is a function in 
an extension module. Does it have to be thread safe? If it isn't, what 
limitations does this impose on the use of this wrapper?

All that aside, I read the previous threads but it took until just now 
to understand how this works. :-) I'll probably have a go at 
implementing this in D, as that will be more convenient for the library...

-Kirk McDonald



More information about the Python-list mailing list