PracticU

הסבר על תכנות אסינכרוני

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › הסבר על תכנות אסינכרוני
מילון מושגים:
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
JavaScript - שפת תכנות שרצה בעיקר בדפדפן ומוסיפה אינטראקטיביות לדפי אינטרנט. רצה גם בצד השרת באמצעות Node.js.
תהליכון - יחידת ביצוע בתוך תהליך, המאפשרת להריץ כמה מהלכים במקביל ולחלוק את אותו זיכרון.
Java - שפת תכנות עילית ומונחית עצמים, הרצה על מכונה וירטואלית (JVM) ומשמשת לפיתוח מגוון יישומים.
C# - שפת תכנות מונחית עצמים של מיקרוסופט, המשמשת בעיקר לפיתוח יישומים על פלטפורמת .NET.
Node.js - סביבת ריצה שמאפשרת להריץ קוד JavaScript מחוץ לדפדפן, בעיקר בצד השרת.
מסד נתונים - אוסף מאורגן של נתונים המאוחסן כך שאפשר לשמור, לחפש, לעדכן ולשלוף אותו ביעילות, לרוב באמצעות שפת שאילתות.
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.

הסבר על תכנות אסינכרוני
ב-JavaScript יש חוט ביצוע (Thread) אחד בלבד שמריץ את הקוד. לכן פעולה שלוקחת הרבה זמן עלולה לעכב את כל התוכנית. תכנות אסינכרוני מאפשר לשחרר את החוט בזמן שממתינים לפעולה ארוכה, ולהמשיך לבצע דברים אחרים.
הבעיה
נניח שיש שלוש פעולות, A, B ו-C, ופעולה B לוקחת עשר שניות, למשל עיבוד תמונה או וידאו. בתוכנית רגילה, A מתבצעת, אחר כך B חוסמת עשר שניות, ורק אז מתבצעת C. אם C לא תלויה ב-B, ההמתנה הזאת מיותרת.
למה זה חשוב ב-JavaScript
JavaScript נחשבת Single-threaded, ולכן אין בה טרדים נוספים שמריצים קוד במקביל, כמו ב-Java או ב-C#. ב-Node.js המשמעות חמורה יותר: השרת עובד עם חוט אחד, ולכן אם פעולה כבדה חוסמת אותו, כל הלקוחות ממתינים. בדפדפן אותה בעיה מקפיאה את הדף למשתמש.
מתי פעולה אסינכרונית מתאימה
1. גלישה לשרת מרוחק: הבקשה נשלחת, ובזמן ההמתנה לתשובה שאר הקוד ממשיך לרוץ.
2. טיימר: setTimeout מתזמן פעולה שתתבצע בעוד זמן מסוים, והתוכנית ממשיכה בינתיים.
3. גישה לדיסק או למסד נתונים: ב-Node.js פעולות כאלה לוקחות זמן, ולכן הן נעשות בצורה אסינכרונית.
הבנת המודל האסינכרוני חשובה, כי ב-Node.js פעולות כמו גישה לדיסק ולמסד נתונים נעשות כך.
השיעור הבא בקורס: סימולטור של תכנות אסינכרוני ב-JS

פרקי ההרצאה: הסבר על תכנות אסינכרוני

  1. 00:00

    מהו תכנות אסינכרוני ולמה הוא חשוב

  2. 00:41

    דוגמה של שלוש פעולות ברצף

  3. 02:12

    JavaScript כשפה עם Thread אחד

  4. 03:25

    השוואה לשפות עם טרדים מרובים

  5. 04:21

    המתנה לפעולה ארוכה שחוסמת את הקוד

תמלול ההרצאה: הסבר על תכנות אסינכרוני

הטקסט המלא של הדקות הראשונות בהרצאה «הסבר על תכנות אסינכרוני» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    אנחנו מגיעים לפרק חדש שנקרא Asynchronous Programming, תכנות אסינכרוני. הדבר הזה הוא מאוד נפוץ בג'אווה סקריפט, כשפת ג'אווה סקריפט, גם כשאנחנו עובדים בדפדפן, ומאוד נפוץ, או לא פחות נפוץ, בנוד ג'י אס.

  2. 00:21

    אנחנו הולכים להבין בפרק הזה קודם כל למה הדבר הזה הוא כל כך קריטי וכל כך חשוב, ואיך אנחנו מיישמים את זה כמובן בנוד ג'י אס בכמה טכניקות. אז בואו נניח שאנחנו כרגע מריצים JavaScript בקליינט סייד דפדפן.

  3. 00:41

    כבר נעבור ל-Node.js, אבל בואו נניח שהקובץ הזה הוא JavaScript דפדפן, ואנחנו רוצים להריץ שלושה קטעי קוד שונים. יש לנו פה Console.log, ואנחנו פה מבצעים Operation A. יש לנו Console.log, ואנחנו מבצעים Operation B, ולבסוף Operation C. עכשיו, הקוד הזה שאני כתבתי Operation A, B ו-C זה רק כמובן דמו לקטע קוד אמיתי.

  4. 01:10

    אז אם אנחנו עכשיו הולכים להריץ את זה בג'אווה סקריפט דפדפן, נתחיל עם ג'אווה סקריפט דפדפן, אז כמובן, אני כרגע אריץ את זה כמובן עם Node App, אנחנו נראה מיידית Operation A, B ו-C.

  5. 01:25

    הכל עובד כמו שצריך, וגם לא הייתה פה שום בעיה. מה הבעיה? הנה הצגנו את A, הנה את B, הנה את C. אבל בוא נניח שאופריישן B לוקח 10 שניות לביצוע. בוא נניח שאופריישן B זה איזשהו קטע קוד שמבצע עיבוד תמונה או עיבוד וידאו.

  6. 01:49

    בקליינט סייד, בג'אווה סקריפט אוף דה פאן. אבל אין מה לעשות, עיבוד תמונה או עיבוד וידאו זה משהו שלוקח הרבה זמן, ובוא נניח שזה לוקח 10 שניות.

  7. 02:01

    מה יקרה אז? אז אופריישן A מיד יתבצע, אופריישן B ייקח לו 10 שניות להתבצע, אבל השאלה, מה קורה ל-Operation C? אז JavaScript כשפת JavaScript נחשבת שפה של Single Threaded.

  8. 02:18

    Thread זה בעצם ההליך שמריץ לי את האפליקציה, ההליך שמריץ לי את הקוד עצמו. Single Threaded ואומר שיש לנו ב-JavaScript אך ורק Thread אחד ויחיד שמסוגל להריץ את הקוד שאנחנו כותבים.

  9. 02:40

    עכשיו, מה זה מעניין אותי שיש לי רק טרד אחד? כי כל טרד מסוגל להריץ קטע קוד במקביל לטרדים אחרים במחשב.

  10. 02:49

    נניח, בואו ניקח את הצורה הכי מקבילית שיכולה להיות, נניח שהמחשב יש לו ארבעה מעבדים, אז אם אנחנו לוקחים נניח ארבעה טרדים, כל אחד יכול בצורה תיאורטית להשתמש במעבד אחר, וכך באמת הקודים שלנו ירוצו במקביל. גם אם יש לנו מעבד אחד, עדיין אם יש לנו כמה טרדים אז המחשב עושה

  11. 03:13

    את זה בכל כך מהירות גבוהה שזה באמת תהיה מבחינתנו פעולות בצורה מקבילות, בצורה מקבילה, פעולות מקבילות, מפני שטרד מבחינתנו מריץ קטע קוד במקביל.

  12. 03:30

    כל מיני שפות בעולם יש להם אפשרות להריץ מספר טרדים, לדוגמה Java, שפת Java יש לה טרדים, אנחנו יכולים לפתוח טרד ולהריץ פעולות במקביל לשאר האפליקציה.

  13. 03:41

    לדוגמה, C-Sharp, אנחנו יכולים לפתוח טרד ולהריץ פעולות במקביל לשאר האפליקציה שאנחנו בונים.

  14. 03:48

    ב-JavaScript אנחנו לא יכולים לעשות את זה, JavaScript Native, אנחנו לא יכולים לעשות את זה. באיזושהי גרסה מתקדמת יותר של JavaScript, בדפדפן הוסיפו משהו שמאפשר לפתוח טרד נוסף, אבל כאשר אנחנו עובדים ב-JavaScript בצורה רגילה, אין לנו אפשרות לעשות את זה, JavaScript נחשבת Single-threaded אז כל התהליך

  15. 04:10

    שמריץ את לנו את האפליקציה זה התהליך האחד והיחיד שאנחנו רואים כאן. תריץ לי בבקשה את Operation A לאחר מכן תריץ לי את Operation B שלוקח 10 שניות כמו שאמרנו ולבסוף תריץ לי את Operation C.

  16. 04:27

    מה יקרה? Operation C צריך להמתין עד ש-Operation B יסיים. ומה אם Operation C לא קשור ל-Operation B? אנחנו רוצים לא להמתין עד לסיום Operation B אלא לבצע את Operation B ואז או במקביל או בלי צורך להמתין לבצע גם את Operation C.

  17. 04:52

    אז אם ה-Operation B זה בעצם עיבוד תמונה או עיבוד וידאו או לא משנה איזה קטע קוד שפשוט לוקח הרבה זמן אין לנו שום ברירה ובג'אווה סקריפט נייטיב אנחנו נצטרך לראות את Operation A אנחנו נראה את Operation A אנחנו נמתין את ה-10 שניות עד ש-Operation B יסיים ואז אנחנו נראה את Operation C.

  18. 05:12

    אוקיי, בסדר, בשפות אחרות היינו יכולים להוציא את זה לטרדים נפרדים, סבבה, אבל מה קורה אם Operation B לוקח 0 שניות אבל אנחנו לא חייבים לעצור את כל קטע הקוד הזה בשביל להמתין ל-10 שניות האלה?

  19. 05:30

    זה קורה כאשר הקוד המאסיבי של Operation B

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: ריבוי קבצי הגדרות עבור סביבות שונות ב-NodeJS

ההרצאה הבאה: סימולטור של תכנות אסינכרוני ב-JS

הרצאות קשורות מקורסים אחרים

  • תכנות אסינכרוני ASYNC בשפת Dart
  • הסבר כללי על קורסי תכנות
  • מבוא לקורס תכנות מתקדם
  • יתרונות של תכנות מונחה עצמים

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React