۳ مهسا منظمی
چک کردن q.empty برای شرط
Reza Mobaraki حل شده توسط Reza Mobaraki

یه چیزی رو من متوجه نمیشم. استاد میگن توی شرط q.empty نذارید چون thread safe نیست و while true بذارید. در صورتی که خوب در این حالت هم شرط همیشه true هست و اون مشکل که گفتن به وجود میاد. این قسمت اشتباهه و گنگ. لطفا توضیح بدید.

درود وقتتون بخیر

نکته اینجاست که بحث True بودن نیستش بحث Error ای که بعد از وارد شدن به حلقه raise میشه .

به طور کلی زمانی که یک صف خالی هست و شما میخواید چیزی رو get کنید ازش بهتون ارور برمیگردونه. در دقیقه ۱۴:۲۰ که استاد دارن race condition رو توضیح میدن. این زمانی اتفاق میوفته که اخرین لینک توی queue هست و شما نمیدونید دومین ترد چه زمانی قراره مجدد وارد حلقه بشه در نتیجه ممکنه قبل از اینکه ترد اول اخرین لینک رو بگیره، ترد دوم وارد حلقه بشه و برنامه کلا به ارور بخوره .

def get_page (number):
     # while q.empty(): # This line cuased race condition
     while True:
         url = q.get() # An error may be raised by this line during a race condition.
         try:
             response = requests.get(ur1)
         except:
             print(f"Error occurred {url}")
         print(f"worker {number} \\t get completed {url} \\t queue size {q.qsize()]")
        q.task_done( O
         if q.empty(): # less cost during error 
             break

در نتیجه اون شرط خالی بودن صف رو به اخر حلقه انتقال دادن که هزینه کمتری ایجاد کنه .

امیدوارم جواب سوالتون رو گرفته باشید

موفق باشید ?

Reza Mobaraki ۲۶ شهریور ۱۴۰۲، ۱۴:۲۰

بحث اینه که while q.empty دوتا thread آخر رو رد میکنه به خط بعد و خوب while true هم همین کار رو میکنه و خطا میخوره.

مهسا منظمی ۲۶ شهریور ۱۴۰۲، ۱۵:۱۵

while True اخرین مقدار صف رو برمیداره و وقتی حلقه به پایان رسید به شرط میرسه و break میشه 

بهترین پاسخ
Reza Mobaraki ۲۸ شهریور ۱۴۰۲، ۱۰:۱۶