Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python线程:监视线程并在线程完成后执行附加代码_Python_Python Multithreading - Fatal编程技术网

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是的,那会更好,下面迈克·穆勒的答案似乎有效。我想我只是需要一个外部视角,因为我不知道怎么做,但迈克似乎有一个非常好的工作解决方案。不知道为什么我的问题被否决了……这正是我想要的。非常感谢。我不知道如何根据正在执行的线程调用适当的函数,但这似乎确实可行。干杯很高兴听到这有帮助。如果它能解决你的问题,你可以找到答案。这正是我想要的。非常感谢。我不知道如何根据正在执行的线程调用适当的函数,但这似乎确实可行。干杯很高兴听到这有帮助。如果它解决了你的问题,你可以给出一个答案。