How to pass and run a callback method in Python

前端 未结 3 1063
孤街浪徒
孤街浪徒 2020-12-28 14:34

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() met

3条回答
  •  时光说笑
    2020-12-28 14:49

    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.start()
    

    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.

提交回复
热议问题