Analyse tracks in a pool of worker processes
A first pass over an unanalysed library is hours of librosa, and there was no reason for a desktop to spend them one core at a time. Analysis now runs in a process pool sized by `general.library.analysis_workers`, defaulting to one per core bar one (capped at 8) when the key is absent. Two consequences worth knowing before touching this: whatever an `Analyzer` returns has to be picklable, and an analyzer that keeps state on its own instance - a test double counting calls - only behaves as written with `analysis_workers=1`. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -32,7 +32,7 @@ from musicmouse.devices.mouse import MusicMouseDevice
|
||||
from musicmouse.devices.null_transport import NullTransport
|
||||
from musicmouse.devices.player import Player, VlcPlayer
|
||||
from musicmouse.devices.serial_link import SerialLink
|
||||
from musicmouse.library import MusicLibrary
|
||||
from musicmouse.library import MusicLibrary, default_worker_count
|
||||
from musicmouse.library.analysis import build_analyzer
|
||||
from musicmouse.reactions import register_all
|
||||
from musicmouse.services.base import Service
|
||||
@@ -283,11 +283,16 @@ def _build_player(bus: EventBus, general: GeneralConfig, *, clock: RealClock) ->
|
||||
|
||||
async def build_library(config: Config) -> MusicLibrary:
|
||||
library_config = config.general.library
|
||||
workers = library_config.analysis_workers
|
||||
return await MusicLibrary.build(
|
||||
library_config.root,
|
||||
library_config.cache,
|
||||
frozenset(config.general.audio_extensions),
|
||||
analyzer=build_analyzer(),
|
||||
# Unset in the config means "use the machine": a first pass over an unanalyzed
|
||||
# library is hours of DSP, and there is no reason for a desktop to do it one
|
||||
# core at a time. `MusicLibrary` itself defaults to 1 - see its docstring.
|
||||
analysis_workers=default_worker_count() if workers is None else workers,
|
||||
figure_kinds=config.figure_kinds,
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user