0

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

回答

1

你可以使用asyncio並創建一個事件循環。您可以使用asyncio.async()創建一個不會阻止事件循環執行的異步任務。

+0

你好,謝謝你的回答。我默默地說我在Python 2.7中,我正在編輯我的文章:) – EddaSnorra

+0

好的,在這種情況下,您可以使用python的線程模塊。創建一個工作者來完成這個任務,然後在工作完成時加入()該工作者。 –

+0

我會試試看,謝謝 – EddaSnorra

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

+0

另外,如果您打算使用大量線程,請確保您查看線程安全。例如,考慮兩個線程試圖對同一對象執行操作的場景。 –