У меня есть код потребитель-производитель для моего кода, с двумя очередями, одна для производителя и одна для потребителя.Причина, по которой у производителя также есть очередь, состоит в том, что потребитель иногда помещает свой результат обратно в очередь производителя, если он не проходит проверку качества из цикла потребления.Пользователь предоставит новые рекомендации для этого типа элемента, чтобы в следующий раз, когда производитель вернется к этому элементу, он мог обрабатывать более точно и, надеюсь, в следующий раз прошел проверку качества.
Проблема в том, что производитель может нанести ущерб, производя тонны изделий одного и того же типа, которые иногда могут иметь одну и ту же ошибку, которая была бы обнаружена при проверке качества первого элемента этоготип для потребления.Таким образом, было бы более эффективно, если бы производитель ожидал, пока пользователь проверит качество одного элемента такого типа в цикле потребления, а затем воспользуется рекомендацией контроля качества для производства большего количества элементов того же типа.Пока продюсер ждет, я хочу, чтобы он производил другие «уникальные» предметы.Вот пример кода, объясняющий, что я хочу, чтобы он делал:
# CODE WITHOUT PRODUCER CHECKING FOR FIRST TIME ENCOUNTER OR TWEAKS
def producerWorker(producerQueue, consumerQueue):
while True:
item = producerQueue.get()
if item is None:
break
processedItem = processItem(item)
consumerQueue.put(processedItem)
producerQueue.task_done()
def consumerWorker(producerQueue, consumerQueue):
while True:
processedItem = consumerQueue.get()
if processedItem is None:
break
returnedItem = qualityCheck(processedItem)
if returnedItem:
# quality check failed, put it back for the producer to reproduce with new hyperparam tweaks
producerQueue.put(returnedItem)
consumerQueue.task_done()
def processItem(item):
# run algorithm on item
return item
def consumerFucntion(item):
presentToUser(item)
while True:
userCheck = input('Quality good? y or n: ')
if userCheck == 'y':
return None
elif userCheck == 'n':
# ask user to select hyperparameter tweak options.
tweakOption = input('Choose hyperparameter tweak options 1, 2, or 3: ')
item.hyperparameter = tweakOption
return item
Что я хочу:
- Производитель обрабатывает элемент, если он встречается с ним в первый раз.этого типа.Это отслеживается в наборе питонов
processedTypes
- Производитель обрабатывает элемент, если он был обработан, а затем прошел проверку качества в цикле потребления.Любые типы, которые уже одобрены по качеству, отслеживаются в
tweakDoneTypes
. Настройки гиперпараметра функции потребителя должны применяться ко ВСЕМ элементам этого типа, а не только к экземпляру объекта этого типа.Нужен ли мне целый отдельный объект / словарь для сопоставления типа с настройками гиперпарама?
# CODE WITH PRODUCER CHECKING
# these sets must be the global sets that producer and consumers share? Is there a better data type here?
processedTypes = set() # If it's the first time a type of item is being processed, let it be processed by the producer
tweakDoneTypes = set() # If it has passed the consumer quality check, allow all items of this type to be processed
def producerWorker(producerQueue, consumerQueue):
while True:
item = producerQueue.get()
if item.type not in processedTypes or item.type in tweakDoneTypes:
processedItem = processItem(item)
processedTypes.add(item.type)
consumerQueue.put(processedItem)
producerQueue.task_done()
elif item is None:
break
else:
# put item back, don't want to process this item until hyperparam tweaks provided
producerQueue.put(item)
sleep(1000)
def consumerWorker(producerQueue, consumerQueue):
while True:
processedItem = consumerQueue.get()
if processedItem is None:
break
returnedItem = qualityCheck(processedItem)
if returnedItem:
# quality check failed, put it back for the producer to reproduce with new hyperparam tweaks
producerQueue.put(returnedItem)
else:
# quality check passed, all other items of this type should follow this hyperparam tweak
tweakDoneTypes.add(processedItem.type)
# Go through all items on producerQueue and update hyperparameters for items of the same type
# I don't think a Queue object is iterable?
for item in producerQueue:
if item.type == processedItem.type:
item.hyperparameter = processedItem.hyperparameter
consumerQueue.task_done()
Как получить наборы для безопасного распределения между производителем и потребителем?Мой шаблон дизайна чист или имеет большой недостаток?Я обобщил код и пропустил некоторые части, которые, по моему мнению, не нужны для вопроса, но все же закончил публикацией большого блока кода.Благодарю.
Редактировать: Не для того, чтобы сделать вопрос еще длиннее, но что я хочу, чтобы продюсер сделал, если у нас есть 5 элементов вQQueue и говорят, что они относятся к типам A, A, B, B и C:
- Возьмите первый элемент, посмотрите, что тип A ранее не обрабатывался, поэтому обработайте его и поместите processingItem в consumerQueue
- Возьмите второй элемент, посмотрите, что тип Aбыл обработан до того, как AND еще не был проверен пользователем, поэтому верните его обратно вQQQueue.Спите здесь секунду или две (в случае, если все предметы относятся к типу А, и он будет непрерывно прожигать все предметы в очереди на полной скорости, пока потребитель не проверит предмет)
- Возьмите третий предмет, убедитесь, что онимеет тип B, проверьте, что он не был обработан ранее, поэтому обработайте его и поместите его в consumerQueue.
- Повторяйте, пока все элементы не будут обработаны.