Browse Source

Change the way DownloadManager collects the number of successful downloads

Before a callback was used to increase the number of successful downloads
resulting in multiple worker threads trying to edit the same variable.
Now each worker thread stores the number of successful downloads for itself
and the DownloadManager collects this number after download process
has finished.
doc-issue-template
MrS0m30n3 9 years ago
parent
commit
76b4138fb5
1 changed files with 12 additions and 21 deletions
  1. 33
      youtube_dl_gui/downloadmanager.py

33
youtube_dl_gui/downloadmanager.py

@ -72,7 +72,9 @@ class DownloadManager(Thread):
self._successful = 0 self._successful = 0
self._running = True self._running = True
self._workers = self._init_workers(opt_manager.options['workers_number'])
wparams = (opt_manager, self._youtubedl_path(), log_manager)
self._workers = [Worker(*wparams) for i in xrange(opt_manager.options['workers_number'])]
self.start() self.start()
@property @property
@ -86,10 +88,6 @@ class DownloadManager(Thread):
to complete. """ to complete. """
return self._time_it_took return self._time_it_took
def increase_succ(self):
"""Increase number of successful downloads. """
self._successful += 1
def run(self): def run(self):
self._check_youtubedl() self._check_youtubedl()
self._time_it_took = time.time() self._time_it_took = time.time()
@ -108,6 +106,7 @@ class DownloadManager(Thread):
for worker in self._workers: for worker in self._workers:
worker.close() worker.close()
worker.join() worker.join()
self._successful += worker.successful
self._time_it_took = time.time() - self._time_it_took self._time_it_took = time.time() - self._time_it_took
@ -193,16 +192,6 @@ class DownloadManager(Thread):
path = os.path.join(path, YOUTUBEDL_BIN) path = os.path.join(path, YOUTUBEDL_BIN)
return path return path
def _init_workers(self, workers_number):
"""Initialize the custom thread pool.
Returns:
Python list that contains the workers.
"""
youtubedl = self._youtubedl_path()
return [Worker(self.opt_manager, youtubedl, self.increase_succ, self.log_manager) for i in xrange(workers_number)]
class Worker(Thread): class Worker(Thread):
@ -218,9 +207,6 @@ class Worker(Thread):
youtubedl (string): Absolute path to youtube-dl binary. youtubedl (string): Absolute path to youtube-dl binary.
increase_succ (DownloadManager.increase_succ() method): Callback to
increase the number of successful downloads.
log_manager (logmanager.LogManager): Check DownloadManager log_manager (logmanager.LogManager): Check DownloadManager
description. description.
@ -228,9 +214,8 @@ class Worker(Thread):
WAIT_TIME = 0.1 WAIT_TIME = 0.1
def __init__(self, opt_manager, youtubedl, increase_succ, log_manager=None):
def __init__(self, opt_manager, youtubedl, log_manager=None):
super(Worker, self).__init__() super(Worker, self).__init__()
self.increase_succ = increase_succ
self.opt_manager = opt_manager self.opt_manager = opt_manager
self._downloader = YoutubeDLDownloader(youtubedl, self._data_hook, log_manager) self._downloader = YoutubeDLDownloader(youtubedl, self._data_hook, log_manager)
@ -238,6 +223,7 @@ class Worker(Thread):
self._running = True self._running = True
self._url = None self._url = None
self._index = -1 self._index = -1
self._successful = 0
self.start() self.start()
@ -249,7 +235,7 @@ class Worker(Thread):
if (ret_code == YoutubeDLDownloader.OK or if (ret_code == YoutubeDLDownloader.OK or
ret_code == YoutubeDLDownloader.ALREADY): ret_code == YoutubeDLDownloader.ALREADY):
self.increase_succ()
self._successful += 1
# Reset url value # Reset url value
self._url = None self._url = None
@ -282,6 +268,11 @@ class Worker(Thread):
"""Return True if the worker has no job else False. """ """Return True if the worker has no job else False. """
return self._url is None return self._url is None
@property
def successful(self):
"""Return the number of successful downloads for current worker. """
return self._successful
def _data_hook(self, data): def _data_hook(self, data):
"""Callback method to be used with the YoutubeDLDownloader object. """Callback method to be used with the YoutubeDLDownloader object.

Loading…
Cancel
Save