I have a Manager (main thread), that creates other Threads to handle various operations.
I would like my Manager to be notified when a Thread it created ends (when run() method execution is finished).
I know I could do it by checking the status of all my threads with the Thread.isActive() method, but polling sucks, so I wanted to have notifications.
I was thinking of giving a callback method to the Threads, and call this function at the end of the run() method:
MyThread(self.on_thread_finished).start() # How do I pass the callback
def on_thread_finished(self, data):
self.callback(data) # How do I call the callback?
The thread can't call the manager unless it has a reference to the manager. The easiest way for that to happen is for the manager to give it to the thread at instantiation.
class Manager(object): def new_thread(self): return MyThread(parent=self) def on_thread_finished(self, thread, data): print thread, data class MyThread(Thread): def __init__(self, parent=None): self.parent = parent super(MyThread, self).__init__() def run(self): # ... self.parent and self.parent.on_thread_finished(self, 42) mgr = Manager() thread = mgr.new_thread() thread.run()
If you want to be able to assign an arbitrary function or method as a callback, rather than storing a reference to the manager object, this becomes a bit problematic because of method wrappers and such. It's hard to design the callback so it gets a reference to both the manager and the thread, which is what you will want. I worked on that for a while and did not come up with anything I'd consider useful or elegant.