یه چیزی رو من متوجه نمیشم. استاد میگن توی شرط 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 conditionwhileTrue:
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 میشه