Как создать поток внутри другого потока в одном и том же объекте в python?

Я использую vanilla Python 2.7, загружаемый Cygwin

Я хочу иметь возможность создавать подклассы потоков, которые вызывают функцию верхнего уровня, а функция верхнего уровня порождает отдельные потоки, вызывающие функции подуровня. Вот псевдокод

import threading #!/usr/bin/python import threading class Server(threading.Thread): def __init__(self, threadID, target): self.__threadID = threadID self.__target = target threading.Thread.__init__(self) # Function called when the thread's start() function is called def run(self): self.target() pass # This is the top level function called by other objects def reboot(self): # I want this function to spawn two threads # - First thread calls the __powerDown() function # - Secod thread calls the __powerUp() function, and pends # until __powerDown() thread finishes pass def __powerDown(self): # What to put here? pass def __powerUp(self): # What to put here? pass __threadID = '' __target = None # Code calling above code server = Server(123, reboot) # Will this work? 

Что-то вроде этого?

 import threading class Server(threading.Thread): # some code # This is the top level function called by other objects def reboot(self): # perhaps add a lock if not hasattr(self, "_down"): self._down = threading.Thread(target=self.__powerDown) self._down.start() up = threading.Thread(target=self.__powerUp) up.start() def __powerUp(self): if not hasattr(self, "_down"): return self._down.join() # do something del self._down 

Есть много способов сделать это, я больше всего знаком с ThreadPools, и у них есть очень простой интерфейс для вызова потоков и присоединения к ним …

 from multiprocessing.pool import ThreadPool # This is the top level function called by other objects def reboot(self): # setup your thread pool: reboot_pool = ThreadPool() # - First thread calls the __powerDown() function power_down = reboot_pool.apply_async(self.__powerDown()) # this will block until it finishes power_down.get() # - Secod thread calls the __powerUp() function power_up = reboot_pool.apply_async(self.__powerUp()) # block until __powerUp() thread finishes power_up.get() def __powerDown(self): # What to put here? pass def __powerUp(self): # What to put here? pass 

это немного отличается от того, как вы это заявили, потому что сначала я вызываю powerdown, жду этого, чтобы закончить, а затем позвоните в powerUp, но я думаю, что это заставляет задуматься.