Поток не может вызвать менеджера, если у него нет ссылки на менеджера. Самый простой способ для этого состоит в том, чтобы менеджер передал его потоку при создании экземпляра.
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()
Если вы хотите иметь возможность назначать произвольную функцию или метод в качестве обратного вызова, а не сохранять ссылку на объект менеджера, это становится немного проблематичным из-за упаковщиков методов и тому подобного. Трудно спроектировать обратный вызов, поэтому он получает ссылку как на менеджер , так и поток, что вам и нужно. Я работал над этим некоторое время и не придумал ничего, что я бы посчитал полезным или изящным.