Python线程:监视线程并在线程完成后执行附加代码
我有以下代码:Python线程:监视线程并在线程完成后执行附加代码,python,python-multithreading,Python,Python Multithreading,我有以下代码: class MyThread(Thread): def __init__(self, command, template, env, build_flavor, logger): Thread.__init__(self) self.command = command self.template = template self.env = env self.build_flavor = bui
class MyThread(Thread):
def __init__(self, command, template, env, build_flavor, logger):
Thread.__init__(self)
self.command = command
self.template = template
self.env = env
self.build_flavor = build_flavor
self.logger = logger
def run(self):
self.logger.info('Running (%s)...this may take several minutes. Please be patient' % self.build_flavor)
run_command(self.command, self.template, self.env)
self.logger.info('Complete (%s)' % self.build_flavor)
return
然后在另一个类中,当我创建实际线程时:
if self.build_type == 'default':
threads = []
for t in self.template:
modify_template(t)
build_flavor = self.getmatch(t)
thread = MyThread(packer, t, self.new_env, build_flavor, self.logger)
thread.setName(build_flavor)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
vmware_create()
openstack_create()
不幸的是,在线程为.join()d之后,我将串行调用vmware_create()和openstack_create()。我希望能够在它们各自的线程完成后执行它们中的每一个,这样我就不会在启动其中一个*_create()函数之前等待两个线程都完成,然后在执行第二个之前等待第一个线程完成
i、 e.现在,vmware_create()只会在两个线程都完成后执行,一旦vmware_create()完成,openstack_create()才会开始。我希望能够等待各个线程完成,然后对首先完成的任何线程执行_create()函数,同时等待第二个线程完成,然后一旦完成,立即执行其_create()函数以实现真正的并行化
我还没有弄明白怎么做,需要lil帮助。函数是对象。只需将它们交给线程:
class MyThread(Thread):
def __init__(self, command, template, env, build_flavor, logger, func=None):
Thread.__init__(self)
self.command = command
self.template = template
self.env = env
self.build_flavor = build_flavor
self.logger = logger
self.func = func
def run(self):
self.logger.info('Running (%s)...this may take several minutes. Please be patient' % self.build_flavor)
run_command(self.command, self.template, self.env)
self.logger.info('Complete (%s)' % self.build_flavor)
# call func if it is there
if self.func:
self.func()
return
现在,我为前两个线程提供了要调用的函数:
if self.build_type == 'default':
threads = []
funcs = {0: vmware_create, 1: openstack_create}
for i, t in enumerate(self.template):
modify_template(t)
build_flavor = self.getmatch(t)
func = funcs.get(i, None)
thread = MyThread(packer, t, self.new_env, build_flavor,
self.logger, func=func)
thread.setName(build_flavor)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
当然,您可以将它们添加到任何其他线程。函数是对象。只需将它们交给线程:
class MyThread(Thread):
def __init__(self, command, template, env, build_flavor, logger, func=None):
Thread.__init__(self)
self.command = command
self.template = template
self.env = env
self.build_flavor = build_flavor
self.logger = logger
self.func = func
def run(self):
self.logger.info('Running (%s)...this may take several minutes. Please be patient' % self.build_flavor)
run_command(self.command, self.template, self.env)
self.logger.info('Complete (%s)' % self.build_flavor)
# call func if it is there
if self.func:
self.func()
return
现在,我为前两个线程提供了要调用的函数:
if self.build_type == 'default':
threads = []
funcs = {0: vmware_create, 1: openstack_create}
for i, t in enumerate(self.template):
modify_template(t)
build_flavor = self.getmatch(t)
func = funcs.get(i, None)
thread = MyThread(packer, t, self.new_env, build_flavor,
self.logger, func=func)
thread.setName(build_flavor)
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
当然,您可以将它们添加到任何其他线程。为什么不从线程中调用它们?@user193661是的,这会更好,下面迈克·穆勒的答案似乎有效。我想我只是需要一个外部视角,因为我不知道怎么做,但迈克似乎有一个非常好的工作解决方案。不知道为什么我的问题被否决了……为什么你不从帖子中给他们打电话?@user193661是的,那会更好,下面迈克·穆勒的答案似乎有效。我想我只是需要一个外部视角,因为我不知道怎么做,但迈克似乎有一个非常好的工作解决方案。不知道为什么我的问题被否决了……这正是我想要的。非常感谢。我不知道如何根据正在执行的线程调用适当的函数,但这似乎确实可行。干杯很高兴听到这有帮助。如果它能解决你的问题,你可以找到答案。这正是我想要的。非常感谢。我不知道如何根据正在执行的线程调用适当的函数,但这似乎确实可行。干杯很高兴听到这有帮助。如果它解决了你的问题,你可以给出一个答案。