«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Производитель/Потребитель

Производитель/Потребитель

Опубликовано 31 июля 2024 г.
Просматривать:855

Определение

Мы рассматриваем два процесса, называемые «производитель» и «потребитель» соответственно. Производитель представляет собой циклический процесс и каждый раз, проходя свой цикл, он производит определенную порцию информации, которая должна быть обработана потребителем. Потребитель также представляет собой циклический процесс, и каждый раз, когда он проходит свой цикл, он может обрабатывать следующий фрагмент информации в том виде, в котором он был произведен производителем. Простым примером может служить вычислительный процесс, который создает в качестве «порций информации» изображения перфокарт, которые должны быть пробиты перфокартой, играющей роль потребителя.[1]

Producer/Consumer (Produtor/Consumidor)

Объяснение

Производитель создает элементы и сохраняет их в структуре данных, а потребитель удаляет элементы из этой структуры и обрабатывает их.

Если потребление больше, чем производство, буфер (структура данных) опустошается, и потребителю нечего потреблять
Если потребление меньше, чем производство, буфер заполняется, и производитель не может добавить больше элементов. Это классическая проблема под названием ограниченный буфер.

Контекстуализация проблемы

Предположим, у нас есть производитель, который публикует электронное письмо в буфере, и потребитель, который потребляет электронное письмо из буфера и отображает сообщение о том, что электронное письмо было отправлено с новым паролем доступа к указанному электронному адресу.

]

Перейти к реализации

package main

import (
    "fmt"
    "os"
    "strconv"
    "sync"
    "time"
)

type buffer struct {
    items []string
    mu    sync.Mutex
}

func (buff *buffer) add(item string) {
    buff.mu.Lock()
    defer buff.mu.Unlock()
    if len(buff.items) 



Объяснение реализации

  • Сначала мы создаем структуру под названием buffer, которая содержит массив строк под названием items и механизм управления, подобный мьютексу, называемый mu, для управления одновременным доступом.
  • ]
  • У нас есть две функции: одна называется add, которая по сути добавляет элемент в буфер, пока есть свободное место, поскольку емкость буфера составляет всего 5 элементов; и еще один вызов get, который, если в буфере есть элементы, возвращает первый элемент и удаляет этот элемент из буфера.
  • Производитель по сути берет индекс из цикла и объединяет его в строку с именем str, которая содержит индекс и фиктивный домен электронной почты, и добавляет ее в буфер. Добавлен временной интервал для имитации задержки.
  • Потребитель запрашивает элемент из буфера, если в нем есть хотя бы один элемент. Затем Потребитель отображает на экране сообщение, информирующее о том, что было отправлено электронное письмо с новым паролем доступа к элементу, который был опубликован в буфере.

Ссылка на код: https://github.com/jcelsocosta/race_condition/blob/main/producerconsumer/buffer/producerconsumer.go

Ссылка

  1. https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#4.1. Типичное использование общего семафора.

Библиография

https://www.cin.ufpe.br/~cagf/if677/2015-2/slides/08_Concorrencia (Хорхе).pdf

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/celso/producerconsumer-produtorconsumidor-1jok?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3