我正在使用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
答案 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,则可以将其配置为打印线程名称。