Поскольку я не специалист по Python и многопоточному программированию, я хотел бы спросить вас, правильна ли моя реализация.
Моя цель состояла в том, чтобы расширить класс Queue, чтобы его можно было очистить.И удаленные предметы должны быть возвращены.Это все.Моя реализация:
import Queue
class ClearableQueue(Queue.Queue):
def __init__(self, maxsize):
Queue.Queue.__init__(self, maxsize)
def clear(self):
self.mutex.acquire()
copyOfRemovedEntries = list(self.queue)
self.queue.clear()
self.unfinished_tasks = 0
self.all_tasks_done.notifyAll()
self.not_full.notifyAll()
self.mutex.release()
return copyOfRemovedEntries
Это правильно?Спасибо.
Обновление: к сожалению, эта реализация по-прежнему недостаточна, так как task_done может вызвать исключение ValueError после вызова clear ().
Точнее: считается, что очередь используется вмногопоточная среда.Поэтому предположим, что один производитель и один рабочий поток (но вы также можете рассмотреть больше потоков).Обычно, если рабочий поток вызывает get (), после вызова работы должен вызываться task_done ().Если это происходит таким образом, то может случиться так, что поток производителя по какой-то причине вызовет clear (), сразу после того, как рабочий поток вызвал get () и до вызова task_done ().Однако пока это работает, если рабочий поток хотел бы вызвать task_done (), тогда будет сгенерировано исключение.Это связано с тем, что task_done () проверяет количество незавершенных задач, проверяя unfinished_tasks класса Queue.
Было бы интересно, если бы эта проблема могла быть решена только классом ClearableQueue, чтобы можно было вызывать метод clear ()без забот.Или, если должно быть что-то другое, что каким-то образом контролирует вызовы метода.
На самом деле, в моем конкретном случае я не использую метод join (), поэтому мне не нужно вызывать task_done ().Тем не менее, я хотел бы сделать эту функцию полной.Может быть полезно и другим людям.