Ahmed Labadi نشر 8 نوفمبر 2021 أرسل تقرير نشر 8 نوفمبر 2021 (معدل) السلام عليكم يا شباب من فضلكم مساعدة حول تعديل القيم في queue قمت بانشاء بروسيس وقمت بادخال قيم ببروسيس أول ثم أريد التعديل على قيمة في queue ومن ثم اطبعها ببروسيس ثالث تم التعديل في 12 نوفمبر 2021 بواسطة شرف الدين2 توضيح العنوان اقتباس
0 شرف الدين حفني نشر 8 نوفمبر 2021 أرسل تقرير نشر 8 نوفمبر 2021 بتاريخ الآن قال Ahmed Labadi: السلام عليكم يا شباب من فضلكم مساعدة حول تعديل القيم في queue ماهي المشكلة؟ برجاء نشر السؤال بشكل مباشر اقتباس
0 Ahmed Labadi نشر 8 نوفمبر 2021 الكاتب أرسل تقرير نشر 8 نوفمبر 2021 أريد كيفية تعديل في queue مثلا مانوع الميثود لتعديل أو تغيير كل قيمة فيها أنا مبتدأ بالبايثون 1 اقتباس
0 شرف الدين حفني نشر 12 نوفمبر 2021 أرسل تقرير نشر 12 نوفمبر 2021 بتاريخ 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 Ahmed Labadi نشر 13 نوفمبر 2021 الكاتب أرسل تقرير نشر 13 نوفمبر 2021 نعم أعلم أريد استخدامه في parallel programming بالظبط باستخدام Multiprocess اقتباس
0 شرف الدين حفني نشر 13 نوفمبر 2021 أرسل تقرير نشر 13 نوفمبر 2021 بتاريخ 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 Ahmed Labadi نشر 20 ديسمبر 2021 الكاتب أرسل تقرير نشر 20 ديسمبر 2021 بارك الله فيك عندي سؤال اذا بعمل 6 ثريد 2 لقراءة و 2 لتعديل بمعنى نستخرج القيمة التي قبلها ونعطيها قيمة اخرى تكون في الاخير و 2 لطباعتهم لكن بشكل متزامن لقد قمت بعملها لكن المشكل انه يقوم احيانا بطباعة ثريد الخاص بدالة التعديل في الطباعة تطبع هيا الاول وانا اريد طباعة القراة وتكون واحدة بواحدة اقتباس
0 شرف الدين حفني نشر 20 ديسمبر 2021 أرسل تقرير نشر 20 ديسمبر 2021 بتاريخ 11 دقائق مضت قال Ahmed Labadi: بارك الله فيك عندي سؤال اذا بعمل 6 ثريد 2 لقراءة و 2 لتعديل بمعنى نستخرج القيمة التي قبلها ونعطيها قيمة اخرى تكون في الاخير و 2 لطباعتهم لكن بشكل متزامن لقد قمت بعملها لكن المشكل انه يقوم احيانا بطباعة ثريد الخاص بدالة التعديل في الطباعة تطبع هيا الاول وانا اريد طباعة القراة وتكون واحدة بواحدة حسب ما فهمت انك تريد طباعة القراءة أولًا ومن ثم التعديل ولكن ما يحدث أن أحيانا يتم طباعة التعديل قبل القراءة, أليس فهمي صحيحًا؟ اقتباس
0 Ahmed Labadi نشر 24 ديسمبر 2021 الكاتب أرسل تقرير نشر 24 ديسمبر 2021 نعم كلامك صحيح لكن أريده أن يعمل بشكل منظم كيف أعملها لاحظت يوجد في multiprocess ملف look لكن حسب ما قمت بتجربته باستعمال look وجدتها لاتعمل بالتزامن هل يوجد غيرها اقتباس
0 Ahmed Labadi نشر 31 ديسمبر 2021 الكاتب أرسل تقرير نشر 31 ديسمبر 2021 بتاريخ On 20/12/2021 at 10:31 قال شرف الدين2: حسب ما فهمت انك تريد طباعة القراءة أولًا ومن ثم التعديل ولكن ما يحدث أن أحيانا يتم طباعة التعديل قبل القراءة, أليس فهمي صحيحًا؟ نعم كلامك صحيح لكن أريده أن يعمل بشكل منظم كيف أعملها لاحظت يوجد في multiprocess ملف look لكن حسب ما قمت بتجربته باستعمال look وجدتها لاتعمل بالتزامن هل يوجد غيرها اقتباس
السؤال
Ahmed Labadi
السلام عليكم يا شباب من فضلكم مساعدة حول تعديل القيم في queue قمت بانشاء بروسيس وقمت بادخال قيم ببروسيس أول ثم أريد التعديل على قيمة في queue ومن ثم اطبعها ببروسيس ثالث
تم التعديل في بواسطة شرف الدين2توضيح العنوان
9 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.