אשמח לעזרה בהבנת הסבר לקוד 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 שסתם הפסיק באמצע הרצה כדי לתת צ'אנס לשני.
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות