اذهب إلى المحتوى

السؤال

نشر (معدل)

السلام عليكم يا شباب من فضلكم مساعدة حول تعديل القيم في queue قمت بانشاء بروسيس وقمت بادخال قيم ببروسيس أول ثم أريد التعديل على قيمة في queue ومن ثم اطبعها ببروسيس ثالث

تم التعديل في بواسطة شرف الدين2
توضيح العنوان

Recommended Posts

  • 0
نشر
بتاريخ On 11/8/2021 at 18:18 قال Ahmed Labadi:

أريد كيفية تعديل في queue مثلا مانوع الميثود لتعديل أو تغيير كل قيمة فيها أنا مبتدأ بالبايثون

في لغة بايثون ﻻ يوجد هيكل بيانات للطابور(queue datastructure) وإنما الطابور الموجود يتم إستخدامه لأغراض أخرى مثل البرمجة المتوازية(parallel programming, multithreading) وإنما هيكل بيانات الطابور في لغة بايثون يتم إستخدامه عن طريق القوائم(lists)

ماهو الطابور

الطابور(queue) هو نوع من أنواع هياكل البيانات حيث ييعمل بنظام fifo(first in first out) أي أن البيانات التي تدخل في الطابور أولاً تخرج أولا ﻻ يجب أن يتم إختيار البيانات بشكل عشوائي بل يجب أن تمشي بذلك الترتيب فمثلاً إن قمنا بإدخال القيم 1, 2, 3

إذا يجب إخراج 1, 2, 3 ﻻ يمكن أن يتم إخراج القيم بترتيب مخالف 

إنشاء الطابور بإستخدام القوائم 

يحتوي الطابور عادةً على الدوال التالية بشكل أساسي

enqueue(element) يقوم بإدخال قيمة إلى نهاية الطابور
dequeue(element)يقوم بحذف عنصر من بداية الطابور

يوجد في القوائم في بايثون دالة تسمى append ودالة تسمى  insert كﻻهما يقومان بإدخال العناصر إلى الطابور ولكن ماذا يجب نستخدم؟ نستخدم هنا الدالة append لأنها تقوم بإدخال العنصر إلى نهاية القائمة مما يحاكي عملية الطابور, على عكس insert التي تقوم بإدخال العنصر في البداية, وهكذا نكون قمنا بمحاكاة الدالة enqueue

بالنسبة للدالة dequeue فيمكننا إستخدام الدالة pop في القائمة والتي تقوم بحذف  عنصر من القائمة ومن ثم إرجاع قيمته فيمكننا إستخدامها مع إعطاؤها الفهرس رقم صفر حتى تقوم بمحاكاة عملية الdequeue , لتصبح في النهاية شكل الدوال كالتالي

queue = []

#محاكاة عملية الenqueue
queue.append('banana')
queue.append('grapes')
queue.append('mango')
queue.append('orange')

#محاكاة عملية الdequeue
#هنا يتم طباعة banana 
first_item = queue.pop(0)
print(first_item)
#هنا يتم طباعة grapes
first_item = queue.pop(0)
print(first_item)

 

  • 0
نشر
بتاريخ 15 ساعات قال Ahmed Labadi:

نعم أعلم أريد استخدامه في parallel programming بالظبط باستخدام Multiprocess

الفكرة من إستخدام الqueue الخاص بمكتبة multiprocessing في بايثون أنه يُعد thread safe أي أنه أمن أن يتم القراءة منه من قِبل أكثر من thread في ذات الوقت دون قلق من أن يحدث تعارض في البيانات وذلك لأنه يضمن عدم حدوث عمليتي قراءة وكتابة في ذات الوقت

الدوال الخاصة بالqueue تشبه التي شرحناها منذ قليل مع إختﻻف المسميات

فمثلاً لوضع قيمة نقوم بإستخدام الدالة put

لسحب قيمة نقوم بإستخدام الدالة get 

بالنسبة للتعديل فﻻ يمكن التعديل على قيم الطابور , حيث أن الفكرة منه أن يكون هناك هيكل بيانات مشترك بين الthreads فمثلاً كما في الشفرة البرمجية التالية

from multiprocessing import Process, Queue
import time
import sys

def reader_proc(queue):
    while True:
        msg = queue.get()         
        if (msg == 'END OF FILE'):
            break

def writer(count, queue):
    for ii in range(0, count):
        queue.put(ii)            
    queue.put('END OF FILE')

pqueue = Queue() 
  for count in [10**4, 10**5, 10**6]:             
        reader_p = Process(target=reader_proc, args=((pqueue),))
        reader_p.daemon = True
        reader_p.start()       

        _start = time.time()
        writer(count, pqueue)   
        reader_p.join()        
        print("Sending {0} numbers to Queue() took {1} seconds".format(count, 
            (time.time() - _start)))

كما تﻻحظ فإننا هنا قمنا بإنشاء اتنين threads أحدهما للقراءة والأخر للكتابة, ولكي يستطيع القارئ قراءة ما يكتبه الكاتب قمنا بتخزين بيانات الكاتب في الطابور المشترك بينهما حيث يقوم الكاتب بكتابة البيانات في الطابور ومن ثم يقوم القارئ بقراءة البيانات من نفس الطابور 

  • 0
نشر

بارك الله فيك 

عندي سؤال اذا بعمل 6 ثريد 2 لقراءة و 2 لتعديل بمعنى نستخرج القيمة التي قبلها ونعطيها قيمة اخرى تكون في الاخير و 2 لطباعتهم لكن بشكل متزامن لقد قمت بعملها لكن المشكل انه يقوم احيانا بطباعة ثريد الخاص بدالة التعديل في الطباعة تطبع هيا الاول وانا اريد طباعة القراة وتكون واحدة بواحدة 

  • 0
نشر
بتاريخ 11 دقائق مضت قال Ahmed Labadi:

بارك الله فيك 

عندي سؤال اذا بعمل 6 ثريد 2 لقراءة و 2 لتعديل بمعنى نستخرج القيمة التي قبلها ونعطيها قيمة اخرى تكون في الاخير و 2 لطباعتهم لكن بشكل متزامن لقد قمت بعملها لكن المشكل انه يقوم احيانا بطباعة ثريد الخاص بدالة التعديل في الطباعة تطبع هيا الاول وانا اريد طباعة القراة وتكون واحدة بواحدة 

حسب ما فهمت انك تريد طباعة القراءة أولًا ومن ثم التعديل ولكن ما يحدث أن أحيانا يتم طباعة التعديل قبل القراءة, أليس فهمي صحيحًا؟

  • 0
نشر
بتاريخ On 20‏/12‏/2021 at 10:31 قال شرف الدين2:

حسب ما فهمت انك تريد طباعة القراءة أولًا ومن ثم التعديل ولكن ما يحدث أن أحيانا يتم طباعة التعديل قبل القراءة, أليس فهمي صحيحًا؟

نعم كلامك صحيح لكن أريده أن يعمل بشكل منظم كيف أعملها لاحظت يوجد في multiprocess ملف look لكن حسب ما قمت بتجربته باستعمال look وجدتها لاتعمل بالتزامن هل يوجد غيرها 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...