Вы не можете проверить размер очереди в одном операторе, а затем .get()
из очереди в следующем. Тем временем весь мир мог измениться. Вызов метода .get()
- это единственная атомарная операция, которую вам нужно вызвать. Если он поднимает Empty
или блокирует, очередь пуста.
Ваши темы могут перезаписывать вывод друг друга. Я хотел бы иметь другой поток с входной очередью, единственной задачей которого является печать элементов в очереди на стандартный вывод. Он также может отсчитывать количество выполненных предметов и получать информацию о состоянии.
Я также склоняюсь не к подклассу Thread
, а вместо этого просто предоставляю простой Thread
экземпляр с параметром target=
и .start()
поток.
на основе вашего ответа, попробуйте это:
download_queue = queue.Queue()
class Downloader(threading.Thread):
def __init__(self,work_queue, original_size):
super().__init__()
self.current_job = 0
self.work_queue = work_queue
self.queue_size = original_size
def run(self):
while True:
try:
url = self.work_queue.get(False)
system_call = "wget -nc -q {0} -O {1}".format(url,local_file)
os.system(system_call)
# the following code is questionable. By the time we get here,
# many other items may have been taken off the queue.
self.current_job = int(self.queue_size) - int(self.work_queue.qsize())
self.percent = (self.current_job / self.queue_size) * 100
sys.stdout.flush()
status = ("\rDownloading " + url.split('/')[-1] +
" [status: " + str(self.current_job) +
"/" + str(self.queue_size) + ", " +
str(round(self.percent,2)) + "%]" )
except queue.Empty:
pass
finally:
self.work_queue.task_done()
def main:
if download_queue.qsize() > 0:
original_size = download_queue.qsize()
if options.active_downloads:
active_downloads = options.active_downloads
else:
active_downloads = 3
for x in range(active_downloads):
downloader = Downloader(download_queue, original_size)
downloader.start()
download_queue.join()