איך עובד קוד אסינכרוני בJS?
-
@nigun אמר באיך עובד קוד אסינכרוני בJS?:
מה הבעיה לעצור את הthread?
כי אין thread אחר. יש רק אחד. אם תעצור את ה-thread תגרום לפקק רציני. כל הדף יתקע (במקרה של דפדפן). או במקרה של נוד, כל השרת יתקע.
אה, אז למה לא נעשה כמה thread-ים? כי זה יקר, וזה בדיוק מה שנוד מנסה לחסוך. -
@nigun אמר באיך עובד קוד אסינכרוני בJS?:
ששם עוצרים את הthread עד לקבלת תוצאה)
בטוח?
ואם אני מפעיל לולאה 800 שמריצה בכל פעם פונקציה עם go
היא אוספת thread מכל העיר?זה אל מגבלה, זו צופר
למה מיקסר שרכשת צריך להמתין מכובה כי כבר טחנת בו תפוזים עד שתטחון במיקסר אחר גם את התפוחים? עדיף לרכוש 2 קערות ולהשתמש במיקסר אחד . -
@nigun אמר באיך עובד קוד אסינכרוני בJS?:
אז מה הפתרון?
callback.
מה זה? נסביר,
אבל לפני כן שווה להכיר את ה-event loop של JS (למרות שדוד טען שזה לא הכרחי...)
ה-thread הראשי של JS אוחז בלולאה אחת גדולה כל משך חיותו. הלולאה הזאת מריץ חתיכות קוד, כשהוא מגיע לסוף הקטע הוא בודק את התור של משימות אם יש עוד משימות. אם יש הוא מריץ אותם ושוב חוזר לבדוק אם יש עוד משימות. ה-thread נמצא במצב idle רק כאשר אין עוד משימות.
כאשר אתה מריץ בקשת http למשל, אז לחכות עד שזה יסתיים אסור כי זה יתקע את ה-thread, אז מה אתה עושה? אתה אומר ל-runtime "תריץ בשבילי את הבקשה הזאת, וכאשר הוא יסתיים תריץ את הפונקציה הזאת - ה-callback עם התשובה של הבקשה כארגומנט".
עכשיו ה-runtime לוקח את הבקשה ואת ה-callback, שולח את הבקשה ומסמן לעצמו משימה חדשה לבדוק בכל איטרציה של הלולאה אם הבקשה הסתיימה. אם לא, נעבור למשימה הבאה, אם כן, נריץ את פונקציית ה-callback. -
@אהרן אמר באיך עובד קוד אסינכרוני בJS?:
@nigun אמר באיך עובד קוד אסינכרוני בJS?:
ששם עוצרים את הthread עד לקבלת תוצאה)
בטוח?
ואם אני מפעיל לולאה 800 שמריצה בכל פעם פונקציה עם go
היא אוספת thread מכל העיר?למטב ידעתי, כן.
זה אל מגבלה, זו צופר
למה מיקסר שרכשת צריך להמתין מכובה כי כבר טחנת בו תפוזים עד שתטחון במיקסר אחר גם את התפוחים? עדיף לרכוש 2 קערות ולהשתמש במיקסר אחד .לא הבנתי את הדימוי
ומה הבעיה בזה?
כשאתה מפעיל הרבה בקשות לmysql ואתה פותח את htop, כמה thread-ים את הרואה שם? -
-
-
@אהרן
לא התכוונתי להיכנס לוויכוח הזה (בעקיר כי אני לא יודע)
סך הכל אני עושה השוואות בשביל להבין מה קורה.@אהרן אמר באיך עובד קוד אסינכרוני בJS?:
אתה יודע להסביר על מאחורי התהליכים ב-GO?
מוכרח להיות, כי GO הבנת.אמנם לא הבנתי עדיין את סודות הgo-scheduler
אבל GO הנחשב שפה די מינימליסטית
ואין שם כ"כ הרבה מה לפספס.
למשל מסבירים לך שgoroutine זה thread קליל
ואפשר להריץ אלפים כאלו בלי בעיה
אמנם מעניין אותי מה בדיוק ההבדל (אני בדיוק התחלית לקרוא על זה עכשיו, כי שאלת)
אבל לא נראה כ"כ קריטי.ובכל זאת כשאני קורא מאמר שמסביר איך defer עובד
אני נהנה.ושוב לא באתי להתנגח
לכל שפה יש יתרון משלה. -
@אהרן אמר באיך עובד קוד אסינכרוני בJS?:
אתה מציג א"ז כמגבלה, ונותן לנו להתנצל בשם JS.
קודם כל זה ללא ספק מגבלה.
כי זה חוסם בפניך כל אפשרות למקביליות.
ולא להתבלבל בין אסינק למקביליות.. אסינק הוא לא מקבילי.בדיוק אתמול שמעתי דוגמא יפה לבעיות מקביליות בJS,
אנימיציה שרצה ברקע ומציגה אנליזות על טקסט..
כל טקסט שנכתב לתיבה בעצם גורם לטריגר של אנליזות.. מה שגורם לתקיעות באנימיציה כי האנליזה מתבצעת בת'רד הראשי וחוסמת את האנימיציה
(הפתרון היה webworker כי הוא פותח ת'רד חדש..)@אהרן אמר באיך עובד קוד אסינכרוני בJS?:
מה נותן לך שכפול thread,
מקבליות וביצועים.
בהמשך לדוגמא שהבאתי, הרי בהכרח שהמעבד מסוגל מבחינת משאבים להריץ גם את האנליזות וגם את האנימיציה בו זמנית, (ת'רד נוסף בהכרח ירוץ על אותו ליבה.)