היום למדתי: אופרטור += בפייתון נראה אטומי על מעבדי אפל
בזמן ריענון מצגת על פייתון וביצוע תהליכים במקביל הרצתי את התוכנית של ה Threads שמראה למה צריך לסנכרן גישה למשתנים למרות ה GIL:
import threading
i = 0
def test():
global i
for x in range(100000):
i += 1
threads = [threading.Thread(target=test) for t in range(10)]
for t in threads:
t.start()
for t in threads:
t.join()
print(i)
assert i == 1000000, i
אבל במקום להתרסק ב assert הכל עבר בשלום.
לא עזר להריץ שוב. ושוב. ושוב.
רק בשביל לראות שלא השתגעתי הרצתי את אותה תוכנית על חלונות ולינוקס וכמובן בשתי המכונות שניסיתי הכל התרסק כצפוי. מה קורה פה?
לצערי לא מצאתי כלום בחיפוש רגיל ברשת, וגם Chat GPT לא ידע על מה אני מדבר. בינג הכיר את התופעה וטען שהמעבד של אפל יודע לעבוד בצורה אטומית על ערכים של 64 ביט ונראה לו שזאת הסיבה, אבל אני לא בטוח שאני מאמין לו או רואה את הקשר. כך שנצטרך להישאר עם פוסט פתוח להיום ואם אתם מכירים את ההסבר לתופעה אשמח לשיתוף.
כן כדאי לזכור שבהיעדר תיעוד רלוונטי ובהינתן שהקוד נשבר על מערכות הפעלה אחרות לא כדאי להתסמך על עובדה זו בעבודה שלכם עם פייתון על מעבדי אפל ותמיד תזכרו להוסיף נעילות כשכותבים קוד בו מספר תהליכונים מעדכנים את אותם משתנים.