"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > المنتج/المستهلك

المنتج/المستهلك

تم النشر بتاريخ 2024-07-31
تصفح:955

تعريف

نحن نعتبر عمليتين، تسمى "المنتج" و"المستهلك"، على التوالي. المنتج عبارة عن عملية دورية وفي كل مرة تمر بدورتها تنتج جزءًا معينًا من المعلومات، والتي يجب معالجتها من قبل المستهلك. المستهلك هو أيضًا عملية دورية، وفي كل مرة يمر فيها، يمكنه معالجة الجزء التالي من المعلومات، كما تم إنتاجها من قبل المنتج. مثال بسيط يتم تقديمه من خلال عملية حسابية، والتي تنتج على شكل "أجزاء من المعلومات" صورًا لبطاقات مثقوبة يتم تثقيبها بواسطة بطاقة مثقوبة، والتي تلعب دور المستهلك.[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، والتي تحتوي على مصفوفة من السلاسل تسمى عناصر وآلية تحكم تشبه كائن المزامنة، تسمى mu، لإدارة الوصول المتزامن.
  • لدينا وظيفتان: واحدة تسمى الإضافة، والتي تضيف بشكل أساسي عنصرًا إلى المخزن المؤقت، طالما أن هناك مساحة متاحة، نظرًا لأن سعة المخزن المؤقت هي 5 عناصر فقط؛ واستدعاء الحصول آخر، والذي، في حالة وجود عناصر في المخزن المؤقت، يقوم بإرجاع العنصر الأول ويزيل هذا العنصر من المخزن المؤقت.
  • يأخذ Producer بشكل أساسي الفهرس من الحلقة ويسلسله في سلسلة تسمى 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