Parallel execution when closing VMs.

This commit is contained in:
Jeremy 2015-02-05 14:24:06 -07:00
parent f2ff933b20
commit 8118d7762f
2 changed files with 22 additions and 6 deletions

View File

@ -97,12 +97,18 @@ class BaseManager:
@asyncio.coroutine
def unload(self):
tasks = []
for vm_id in self._vms.keys():
try:
yield from self.close_vm(vm_id)
except Exception as e:
log.error("Could not delete VM {}: {}".format(vm_id, e), exc_info=1)
continue
tasks.append(asyncio.async(self.close_vm(vm_id)))
if tasks:
done, _ = yield from asyncio.wait(tasks)
for future in done:
try:
future.result()
except Exception as e:
log.error("Could not close VM {}".format(e), exc_info=1)
continue
if hasattr(BaseManager, "_instance"):
BaseManager._instance = None

View File

@ -243,11 +243,21 @@ class Project:
:param cleanup: If True drop the project directory
"""
tasks = []
for vm in self._vms:
if asyncio.iscoroutinefunction(vm.close):
yield from vm.close()
tasks.append(asyncio.async(vm.close()))
else:
vm.close()
if tasks:
done, _ = yield from asyncio.wait(tasks)
for future in done:
try:
future.result()
except Exception as e:
log.error("Could not close VM {}".format(e), exc_info=1)
if cleanup and os.path.exists(self.path):
try:
yield from wait_run_in_executor(shutil.rmtree, self.path)