מתכנתי JavaScript רגילים לזייף מקביליות, אבל יש דרך להשיג מקביליות אמיתית שבה אתה צריך להשתמש עכשיו.
JavaScript יכול להיאבק במשימות עתירות ביצועים מכיוון שזו שפה עם חוט יחיד. באמצעות מקביליות, אתה יכול להשיג ביצוע ריבוי הליכי ב-JavaScript ולשפר את הביצועים וההיענות של יישומי האינטרנט המודרניים שלך.
מקביליות בתכנות JavaScript
מקביליות היא חיונית במחשוב מודרני לשיפור ביצועים ומדרגיות. זה עושה זאת על ידי ניצול יעיל של משאבים זמינים.
טכניקה נפוצה המשמשת להשגת מקביליות בתכנות היא ריבוי השחלות. עם זאת, שרשור ה-JavaScript הוא מערכת חוט בודד ויכול להתמודד רק עם משימה אחת בכל פעם. זה אומר שהוא לא מכיר ביצועים מקבילים של תוכניות.
JavaScript זיוף תכנות מקביל
תפיסה מוטעית נפוצה לגבי מקביליות היא שאתה יכול להשיג אותה באמצעות טכניקות תכנות אסינכרוני כמו אסינכרון/חכה, התקשרויות חוזרות והבטחות:
// פונקציית Async/await המדמה בקשת רשת
אסינכרוןפוּנקצִיָהfetchData() {
const תגובה = לְהַמתִין לְהָבִיא();
const נתונים = לְהַמתִין response.json();
לַחֲזוֹר נתונים;
}// פונקציית התקשרות חוזרת שמתעדת את הנתונים שהובאו לקונסולה
פוּנקצִיָהlogData(נתונים) {
לְנַחֵם.log (נתונים);
}שיטת // Promise.all() שמבצעת מספר הבטחות במקביל
הַבטָחָה.את כל([
fetchData(),
fetchData(),
]).לאחר מכן((תוצאות) => {
לְנַחֵם.log (תוצאות);
});
// קרא לפונקציה fetchData והעבר את פונקציית logData כהתקשרות חוזרת
fetchData().then (logData);
טכניקות אלו למעשה אינן מבצעות קוד במקביל. JavaScript משתמש בלולאת האירועים כדי לחקות תכנות מקביל בתוך העיצוב החוט היחיד שלו.
לולאת האירועים היא חלק בסיסי מסביבת זמן הריצה של JavaScript. זה מאפשר לך לבצע פעולות אסינכרוניות, כגון בקשות רשת, ברקע מבלי לחסום את השרשור הראשי.
לולאת האירועים בודקת כל הזמן אירועים או משימות חדשות בתור ומבצעת אותם בזה אחר זה ברצף. טכניקה זו מאפשרת ל-JavaScript להשיג במקביליות והקבלה תיאורטית.
מקבילות לעומת מַקבִּילוּת
מקביליות והקבילות לרוב לא מובנות ומתחלפות בעולם JavaScript.
מקיפות ב-JavaScript מתייחסת ליכולת לבצע מספר משימות על ידי חפיפה לביצוע המשימות. כאשר משימה אחת יכולה להתחיל לפני שאחרת מסתיימת, אך המשימות לא יכולות להתחיל או להסתיים בו-זמנית. זה מאפשר ל-JavaScript לטפל ביעילות בפעולות, כגון שליפת נתונים מ- REST API או קריאת קבצים, מבלי לחסום את שרשור הביצוע הראשי.
מקביליות, לעומת זאת, מתייחסת ליכולת לבצע מספר משימות בו זמנית על פני מספר שרשורים. שרשורי רקע אלו יכולים לבצע משימות באופן עצמאי ובו-זמנית. זה פותח הזדמנויות להשגת מקביליות אמיתית ביישומי JavaScript.
יישומי JavaScript יכולים להשיג מקביליות אמיתית באמצעות השימוש ב-Web Workers.
עובדי אינטרנט מציגים מקביליות ל-JavaScript
Web Workers הם תכונה של דפדפני אינטרנט מודרניים המאפשרים לרוץ קוד JavaScript בשרשורי רקע, בנפרד משרשור הביצוע הראשי. בניגוד לשרשור הראשי, שמטפל באינטראקציות של משתמשים ובעדכוני ממשק משתמש. Web Worker יהיה מוקדש לביצוע משימות אינטנסיביות מבחינה חישובית.
להלן ייצוג דיאגרמה של פעולתו של Web Worker ב-JavaScript.
השרשור הראשי וה-Web Worker יכולים לתקשר באמצעות העברת הודעות. משתמש ב postMessage שיטה לשלוח הודעות ואת על הודעה מטפל באירועים כדי לקבל הודעות, אתה יכול להעביר הוראות או נתונים הלוך ושוב.
יצירת Web Worker
כדי ליצור Web Worker, עליך ליצור קובץ JavaScript נפרד.
הנה דוגמא:
// main.js// צור Web Worker חדש
const עובד = חָדָשׁ עוֹבֵד('worker.js');
// שלח הודעה ל-Web Worker
worker.postMessage('שלום מהשרשור הראשי!');
// האזן להודעות מ-Web Worker
worker.onmessage = פוּנקצִיָה(מִקרֶה) {
לְנַחֵם.עֵץ('התקבלה הודעה מ-Web Worker:', event.data);
};
הדוגמה שלמעלה יוצרת Web Worker חדש על ידי העברת הנתיב לסקריפט העובד (worker.js) כטענה ל- עוֹבֵד בַּנַאִי. אתה יכול לשלוח הודעה ל-Web Worker באמצעות ה- postMessage שיטה והאזנה להודעות מ-Web Worker באמצעות על הודעה מנהל אירועים.
לאחר מכן עליך ליצור את סקריפט העבודה (worker.js) קובץ:
// worker.js
// האזן להודעות מהשרשור הראשי
self.onmessage = פוּנקצִיָה(מִקרֶה) {
לְנַחֵם.עֵץ('התקבלה הודעה מהשרשור הראשי:', event.data);
// שלח הודעה בחזרה לשרשור הראשי
self.postMessage("שלום מ-worker.js!");
};
הסקריפט של Web Worker מאזין להודעות מהשרשור הראשי באמצעות ה- על הודעה מנהל אירועים. עם קבלת הודעה, אתה מתנתק מההודעה בפנים event.data ושלח הודעה חדשה לשרשור הראשי עם ה postMessage שיטה.
מינוף מקביליות עם עובדי אינטרנט
מקרה השימוש העיקרי עבור Web Workers הוא ביצוע משימות JavaScript אינטנסיביות מבחינה חישובית במקביל. על ידי הורדת משימות אלו ל-Web Workers, תוכל להשיג שיפורי ביצועים משמעותיים.
הנה דוגמה לשימוש ב-web worker לביצוע חישוב כבד:
// main.jsconst עובד = חָדָשׁ עוֹבֵד('worker.js');
// שלח נתונים ל-Web Worker לחישוב
worker.postMessage([1, 2, 3, 4, 5]);
// האזינו לתוצאה מה-Web Worker
worker.onmessage = פוּנקצִיָה(מִקרֶה) {
const result = event.data;
לְנַחֵם.עֵץ('תוצאת חישוב:', תוצאה);
};
Worker.js:
// האזן לנתונים מהשרשור הראשי
self.onmessage = פוּנקצִיָה (מִקרֶה) {
const numbers = event.data;const תוצאה = performHeavyCalculation (מספרים);
// שלח את התוצאה בחזרה לשרשור הראשי
self.postMessage (תוצאה);
};
פוּנקצִיָהלבצע HeavyCalculation(נתונים) {
// בצע חישוב מורכב על מערך המספרים
לַחֲזוֹר נתונים
.מַפָּה((מספר) =>מתמטיקה.pow (מספר, 3)) // קוביות כל מספר
.לְסַנֵן((מספר) => מספר % 20) // סנן מספרים זוגיים
.לְהַפחִית((סכום, מספר) => סכום + מספר, 0); // סכם את כל המספרים
}
בדוגמה זו, אתה מעביר מערך של מספרים מהשרשור הראשי ל-Web Worker. ה-Web Worker מבצע את החישוב באמצעות מערך הנתונים המסופק ושולח את התוצאה בחזרה לשרשור הראשי. ה performHeavyCalculation() function ממפה כל מספר לקובייה שלו, מסננת את המספרים הזוגיים ולבסוף מסכמת אותם.
מגבלות ושיקולים
בעוד ש-Web Workers מספקים מנגנון להשגת מקביליות ב-JavaScript, חשוב לקחת בחשבון כמה מגבלות ושיקולים:
- אין זיכרון משותף: Web Workers פועלים בשרשורים נפרדים ואינם חולקים זיכרון עם השרשור הראשי. לכן, הם לא יכולים לגשת ישירות למשתנים או לאובייקטים מהשרשור הראשי מבלי להעביר הודעה.
- סריאליזציה וסידריאליזציה: בעת העברת נתונים בין השרשור הראשי ל-Web Workers, עליך לבצע סדרה ולבטל את הנתונים בסידרה מכיוון שהעברת הודעות היא תקשורת מבוססת טקסט. תהליך זה כרוך בעלות ביצועים ועשוי להשפיע על הביצועים הכוללים של האפליקציה.
- תמיכה בדפדפן: למרות ש-Web Workers נתמכים היטב ברוב דפדפני האינטרנט המודרניים, ייתכן שחלק מהדפדפנים הישנים יותר או סביבות מוגבלות יש תמיכה חלקית או ללא תמיכה ב-Web Workers.
השג מקביליות אמיתית ב-JavaScript
מקביליות ב-JavaScript היא מושג מרגש המאפשר ביצוע בו-זמני אמיתי של משימות, אפילו בשפה בעלת חוט יחיד. עם הצגת Web Workers, אתה יכול לנצל את כוחה של מקביליות ולהשיג שיפורי ביצועים משמעותיים ביישומי JavaScript שלך.