【问题标题】:Make this code non blocking使此代码非阻塞
【发布时间】:2017-03-29 16:49:18
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: python multithreading concurrency python-multiprocessing


    【解决方案1】:

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

    【讨论】:

    • 您好,感谢您的回答。我没有说我在 Python 2.7 中,我正在编辑我的帖子 :)
    • 好的,这样的话,你可以使用python的threading模块。创建一个工作人员来执行此任务,然后在完成后加入()工作人员。
    【解决方案2】:

    这里是一个使用线程模块的例子:

    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,你可以配置它来打印线程名。

    【讨论】:

    • 另外,如果您打算使用大量线程,请确保查看线程安全性。例如,考虑两个线程尝试对同一个对象执行操作的场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2015-04-28
    • 2020-05-15
    相关资源
    最近更新 更多