mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-07 16:24:16 +02:00
[view.core.controller] enhancement: parallelized installed packages reading
This commit is contained in:
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
### Improvements
|
### Improvements
|
||||||
- General
|
- General
|
||||||
- replaced the internet checking old host (`google.com`) by a more general one (`w3.org`) [#300](https://github.com/vinifmor/bauh/issues/300)
|
- 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
|
- UI
|
||||||
- the "Skip" button on the initialization panel is now enabled after 10 seconds [#310](https://github.com/vinifmor/bauh/issues/310)
|
- the "Skip" button on the initialization panel is now enabled after 10 seconds [#310](https://github.com/vinifmor/bauh/issues/310)
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import os
|
import re
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
from subprocess import Popen, STDOUT
|
from subprocess import Popen, STDOUT
|
||||||
from threading import Thread
|
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, \
|
from bauh.api.abstract.controller import SoftwareManager, SearchResult, ApplicationContext, UpgradeRequirements, \
|
||||||
UpgradeRequirement, TransactionResult, SoftwareAction, SettingsView, SettingsController
|
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.handler import ProcessWatcher, TaskManager
|
||||||
from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, \
|
from bauh.api.abstract.model import SoftwarePackage, PackageUpdate, PackageHistory, PackageSuggestion, \
|
||||||
CustomSoftwareAction
|
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.api.exception import NoInternetException
|
||||||
from bauh.commons.boot import CreateConfigFile
|
from bauh.commons.boot import CreateConfigFile
|
||||||
from bauh.commons.html import bold
|
from bauh.commons.html import bold
|
||||||
@@ -206,6 +206,15 @@ class GenericSoftwareManager(SoftwareManager, SettingsController):
|
|||||||
def _get_package_lower_name(self, pkg: SoftwarePackage):
|
def _get_package_lower_name(self, pkg: SoftwarePackage):
|
||||||
return pkg.name.lower()
|
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:
|
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()
|
ti = time.time()
|
||||||
self._wait_to_be_ready()
|
self._wait_to_be_ready()
|
||||||
@@ -215,6 +224,9 @@ class GenericSoftwareManager(SoftwareManager, SettingsController):
|
|||||||
disk_loader = None
|
disk_loader = None
|
||||||
|
|
||||||
net_available = self.context.is_internet_available()
|
net_available = self.context.is_internet_available()
|
||||||
|
read_threads = list()
|
||||||
|
results = list()
|
||||||
|
|
||||||
if not pkg_types: # any type
|
if not pkg_types: # any type
|
||||||
for man in self.managers:
|
for man in self.managers:
|
||||||
if self._can_work(man):
|
if self._can_work(man):
|
||||||
@@ -222,13 +234,9 @@ class GenericSoftwareManager(SoftwareManager, SettingsController):
|
|||||||
disk_loader = self.disk_loader_factory.new()
|
disk_loader = self.disk_loader_factory.new()
|
||||||
disk_loader.start()
|
disk_loader.start()
|
||||||
|
|
||||||
mti = time.time()
|
t = Thread(target=self._fill_read_installed, args=(man, disk_loader, net_available, results))
|
||||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available)
|
t.start()
|
||||||
mtf = time.time()
|
read_threads.append(t)
|
||||||
self.logger.info(f'{man.__class__.__name__} took {mtf - mti:.2f} seconds')
|
|
||||||
|
|
||||||
res.installed.extend(man_res.installed)
|
|
||||||
res.total += man_res.total
|
|
||||||
else:
|
else:
|
||||||
man_already_used = []
|
man_already_used = []
|
||||||
|
|
||||||
@@ -240,18 +248,22 @@ class GenericSoftwareManager(SoftwareManager, SettingsController):
|
|||||||
disk_loader = self.disk_loader_factory.new()
|
disk_loader = self.disk_loader_factory.new()
|
||||||
disk_loader.start()
|
disk_loader.start()
|
||||||
|
|
||||||
mti = time.time()
|
t = Thread(target=self._fill_read_installed, args=(man, disk_loader, net_available, results))
|
||||||
man_res = man.read_installed(disk_loader=disk_loader, pkg_types=None, internet_available=net_available)
|
t.start()
|
||||||
mtf = time.time()
|
read_threads.append(t)
|
||||||
self.logger.info(f'{man.__class__.__name__} took {mtf - mti:.2f} seconds')
|
|
||||||
|
|
||||||
res.installed.extend(man_res.installed)
|
for t in read_threads:
|
||||||
res.total += man_res.total
|
t.join()
|
||||||
|
|
||||||
if disk_loader:
|
if disk_loader:
|
||||||
disk_loader.stop_working()
|
disk_loader.stop_working()
|
||||||
disk_loader.join()
|
disk_loader.join()
|
||||||
|
|
||||||
|
for result in results:
|
||||||
|
if result.installed:
|
||||||
|
res.installed.extend(result.installed)
|
||||||
|
res.total += result.total
|
||||||
|
|
||||||
if res.installed:
|
if res.installed:
|
||||||
for p in res.installed:
|
for p in res.installed:
|
||||||
if p.is_update_ignored():
|
if p.is_update_ignored():
|
||||||
|
|||||||
Reference in New Issue
Block a user