From a2ca66a2f697cee6cba1ecf95a29cc2c6372f54e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 9 Mar 2018 16:30:17 +0100 Subject: [PATCH] Nicer transfer queue iteration --- blender_asset_tracer/pack/queued_copy.py | 11 ++--------- blender_asset_tracer/pack/transfer.py | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/blender_asset_tracer/pack/queued_copy.py b/blender_asset_tracer/pack/queued_copy.py index b3b0914..543dc52 100644 --- a/blender_asset_tracer/pack/queued_copy.py +++ b/blender_asset_tracer/pack/queued_copy.py @@ -27,14 +27,7 @@ class FileCopier(threading.Thread, transfer.FileTransferer): transfer.Action.MOVE: shutil.move, } - while True: - try: - src, dst, act = self.pop_queued() - except self.Done: - break - except self.Empty: - continue - + for src, dst, act in self.iter_queue(): try: if dst.exists(): st_src = src.stat() @@ -64,7 +57,7 @@ class FileCopier(threading.Thread, transfer.FileTransferer): # copied. The one we just failed (due to this exception) should also # be reported there. self.queue.put((src, dst, act)) - return + break if files_transferred: log.info('Transferred %d files', files_transferred) diff --git a/blender_asset_tracer/pack/transfer.py b/blender_asset_tracer/pack/transfer.py index 38a05bf..d5e96b7 100644 --- a/blender_asset_tracer/pack/transfer.py +++ b/blender_asset_tracer/pack/transfer.py @@ -78,20 +78,19 @@ class FileTransferer(metaclass=abc.ABCMeta): "%d files couldn't be transferred" % len(files_remaining), files_remaining) - def pop_queued(self) -> typing.Optional[QueueItem]: - """Pops an item off the queue, waiting 0.1 sec if the queue is empty. - :raises Done: when all files have been handled, and the work is done. - :raises Empty: when the queue is empty, but more files may be queued - in the future. - """ + def iter_queue(self) -> typing.Iterable[QueueItem]: + """Generator, yield queued items until the work is done.""" - try: - return self.queue.get(timeout=0.1) - except queue.Empty: - if self.done.is_set(): - raise self.Done() - raise self.Empty() + while True: + if self.abort.is_set(): + return + + try: + yield self.queue.get(timeout=0.1) + except queue.Empty: + if self.done.is_set(): + return @abc.abstractmethod def start(self) -> None: