From c667c8472fec86e74e22e2698a8d81df56d69dfd Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Thu, 16 Nov 2023 15:21:13 -0300 Subject: [PATCH] [view.core.controller] enhancement: parallelized installed packages reading --- CHANGELOG.md | 1 + bauh/view/core/controller.py | 44 +++++++++++++++++++++++------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d280dbbb..e4c25346 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Improvements - General - replaced the internet checking old host (`google.com`) by a more general one (`w3.org`) [#300](https://github.com/vinifmor/bauh/issues/300) + - parallelized installed packages reading - UI - the "Skip" button on the initialization panel is now enabled after 10 seconds [#310](https://github.com/vinifmor/bauh/issues/310) diff --git a/bauh/view/core/controller.py b/bauh/view/core/controller.py index 309d8c39..22ec08de 100755 --- a/bauh/view/core/controller.py +++ b/bauh/view/core/controller.py @@ -1,11 +1,11 @@ -import os +import re import re import shutil import time import traceback from subprocess import Popen, STDOUT from threading import Thread -from typing import List, Set, Type, Tuple, Dict, Optional, Generator, Callable, Pattern +from typing import List, Set, Type, Tuple, Dict, Optional, Generator, Callable from bauh.api.abstract.controller import SoftwareManager, SearchResult, ApplicationContext, UpgradeRequirements, \ UpgradeRequirement, TransactionResult, SoftwareAction, SettingsView, SettingsController @@ -13,7 +13,7 @@ from bauh.api.abstract.disk import DiskCacheLoader from bauh.api.abstract.handler import ProcessWatcher, TaskManager from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, \ CustomSoftwareAction -from bauh.api.abstract.view import ViewComponent, TabGroupComponent, MessageType, PanelComponent +from bauh.api.abstract.view import TabGroupComponent, MessageType from bauh.api.exception import NoInternetException from bauh.commons.boot import CreateConfigFile from bauh.commons.html import bold @@ -206,6 +206,15 @@ class GenericSoftwareManager(SoftwareManager, SettingsController): def _get_package_lower_name(self, pkg: SoftwarePackage): return pkg.name.lower() + def _fill_read_installed(self, man: SoftwareManager, disk_loader: DiskCacheLoader, internet_available: bool, + output: List[SearchResult]): + mti = time.time() + man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=internet_available, + limit=-1, only_apps=False) + mtf = time.time() + self.logger.info(f'{man.__class__.__name__} took {mtf - mti:.4f} seconds') + output.append(man_res) + def read_installed(self, disk_loader: DiskCacheLoader = None, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult: ti = time.time() self._wait_to_be_ready() @@ -215,6 +224,9 @@ class GenericSoftwareManager(SoftwareManager, SettingsController): disk_loader = None net_available = self.context.is_internet_available() + read_threads = list() + results = list() + if not pkg_types: # any type for man in self.managers: if self._can_work(man): @@ -222,13 +234,9 @@ class GenericSoftwareManager(SoftwareManager, SettingsController): disk_loader = self.disk_loader_factory.new() disk_loader.start() - mti = time.time() - man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available) - mtf = time.time() - self.logger.info(f'{man.__class__.__name__} took {mtf - mti:.2f} seconds') - - res.installed.extend(man_res.installed) - res.total += man_res.total + t = Thread(target=self._fill_read_installed, args=(man, disk_loader, net_available, results)) + t.start() + read_threads.append(t) else: man_already_used = [] @@ -240,18 +248,22 @@ class GenericSoftwareManager(SoftwareManager, SettingsController): disk_loader = self.disk_loader_factory.new() disk_loader.start() - mti = time.time() - man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available) - mtf = time.time() - self.logger.info(f'{man.__class__.__name__} took {mtf - mti:.2f} seconds') + t = Thread(target=self._fill_read_installed, args=(man, disk_loader, net_available, results)) + t.start() + read_threads.append(t) - res.installed.extend(man_res.installed) - res.total += man_res.total + for t in read_threads: + t.join() if disk_loader: disk_loader.stop_working() disk_loader.join() + for result in results: + if result.installed: + res.installed.extend(result.installed) + res.total += result.total + if res.installed: for p in res.installed: if p.is_update_ignored():