使此代码无阻塞

时间:2017-03-29 16:49:18

标签: python multithreading concurrency python-multiprocessing

我正在使用VSphere API,以下是我正在处理的行:

    task = vm.PowerOff()
    while task.info.state not in [vim.TaskInfo.State.success, vim.TaskInfo.State.error]:
        time.sleep(1)
        log.info("task {} is running".format(task))
    log.ingo("task {} is done".format(task))

这里的问题是,在任务未完成时,这会完全阻止执行。我希望日志记录部分“并行”运行,所以我可以开始其他任务。

我考虑创建一个接受任务作为参数的函数,并像现在一样轮询info.state属性,但是如何使这个非阻塞?

编辑:我正在使用Python 2.7

2 个答案:

答案 0 :(得分:1)

您可以使用asyncio并创建一个事件循环。您可以使用asyncio.async()创建一个不会阻止事件循环执行的异步任务。

答案 1 :(得分:1)

以下是使用线程模块的示例:

import threading

class VMShutdownThread(threading.Thread):
    def __init__(self, vm):
        self.vm = vm
    def run(self):
        task = vm.PowerOff()
        while task.info.state not in [vim.TaskInfo.State.success, vim.TaskInfo.State.error]:
            time.sleep(1)
            log.info("task {} is running".format(task))
        log.info("task {} is done".format(task))

vm_shutdown_thread = VMShutdownThread(vm)

vm_shutdown_thread.start() 

如果您创建logger,则可以将其配置为打印线程名称。