From 9087c8ec679a6729d87972a4edcb365d09657af4 Mon Sep 17 00:00:00 2001 From: Matthias Kestenholz Date: Thu, 9 Jan 2025 10:09:49 +0100 Subject: [PATCH] Introduce a --no-parallel argument --- CHANGELOG.rst | 1 + .../commands/process_imagefields.py | 38 +++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 0135ca0..943e9a5 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -8,6 +8,7 @@ Next version - Rewrote ``process_imagefields`` to use the multiprocessing module, which hopefully improves compatibility on macOS. +- Introduced a ``--no-parallel`` argument to ``process_imagefields``. 0.21 (2024-12-09) diff --git a/imagefield/management/commands/process_imagefields.py b/imagefield/management/commands/process_imagefields.py index 8874a53..10440a0 100644 --- a/imagefield/management/commands/process_imagefields.py +++ b/imagefield/management/commands/process_imagefields.py @@ -25,6 +25,12 @@ def add_arguments(self, parser): default="", help="Run house-keeping tasks.", ) + parser.add_argument( + "--no-parallel", + action="store_true", + dest="no_parallel", + help="Process images sequentially without parallelization.", + ) parser.add_argument( "field", nargs="*", @@ -87,8 +93,6 @@ def _process_field(self, field, options): force=options.get("force"), ) - pool = mp.Pool() - fn = partial( _process_instance, field=field, @@ -96,9 +100,9 @@ def _process_field(self, field, options): force=options.get("force"), ) - try: + if options.get("no_parallel"): for index, (instance, errors) in enumerate( - pool.imap(fn, queryset.iterator(chunk_size=100)) + map(fn, queryset.iterator(chunk_size=100)) ): if errors: self.stderr.write("\n".join(errors)) @@ -112,10 +116,28 @@ def _process_field(self, field, options): # if not done already instance._skip_generate_files = True instance.save() - - finally: - pool.close() - pool.join() + else: + pool = mp.Pool() + try: + for index, (instance, errors) in enumerate( + pool.imap(fn, queryset.iterator(chunk_size=100)) + ): + if errors: + self.stderr.write("\n".join(errors)) + + progress = "*" * (50 * index // count) + self.stdout.write( + f"\r|{progress.ljust(50)}| {index + 1}/{count}", ending="" + ) + + # Save instance once for good measure; fills in width/height + # if not done already + instance._skip_generate_files = True + instance.save() + + finally: + pool.close() + pool.join() self.stdout.write("\r|{}| {}/{}".format("*" * 50, count, count))