אשמח לעזרה בהבנת הסבר לקוד go
-
כאן יש הסבר והדגמה מעולים
ניהול הרצת אותה פונקציה פעמיים על 2 תהליכוניםאני אבל לא מבין מדוע התוצאה
world
hello
hello
world
worldולא
world
hello
world
hello
world
helloהרי הם מדפיסים בהפרשים שווים
רק שיש בניהם את הרגע בין ההרצה של תהליך 1 להרצה של תהליך 2?! -
@אהרן נעתיק את הקוד לפה וננתח מה קורה להבנתי, ייתכן שאני טועה.
1 func say(s string) { 2 for i := 0; i < 5; i++ { 3 time.Sleep(100 * time.Millisecond) 4 fmt.Println(s) 5 } 6 } 7 8 func main() { 9 go say("world") 10 say("hello") 11}
- סביבת ההרצה מגיעה לשורה 9 ומייצר goroutine - נקרא לו GR2, ול-thread הראשי נקרא GR1. עכשיו (נניח שהכל רץ על ליבה פיזי אחד) צריך החלטה מה-scheduler אם להריץ GR2 או GR1.
- כנראה ש-GR2 מקבל קדימה והוא רץ עד שורה 3 ועד בכלל וכאן הוא עוצר ומעביר שליטה ל-GR1.
- GR1 רץ עד לשורה 3 ועד בכלל
- עוברים 100ms עבור GR2 וה-scheduler מריץ שורה 4 ב-GR2. זה מדפיס world.
- עכשיו יש שוב פעם החלטה אם להמשיך GR2 ולהריץ שורה 2 ו-3, או לחזור ל-GR1 שכבר עברו לו 100ms
- כנראה שה-scheduler מחליט לחזור ל-GR1 ולהריץ שורה 4. עכשיו נדפס המילה "hello".
- עכשיו צריך שוב פעם החלטה איזה goroutine להריץ. וכנראה שהפעם הפור נופל על להמשיך את ההרצה של GR1, במקום לעשות context switch שהוא דבר יחסית יקר. כך ש-GR1 מתחיל את ה-sleep לפני GR2.
- וחוזר חלילה
כנראה, ש-thread שסיים זה עתה sleep מקבל קדימה על פני thread שסתם הפסיק באמצע הרצה כדי לתת צ'אנס לשני.