Concurrency בתעשיה

vinney

Well-known member
זה נכון. זה לחלוטין לא נכון.

זה נכון שכל הקוד רק בת׳רד אחד, אבל זה לא נכון שמדובר בתהליך אחד.
&nbsp
האפליקציה עובדת גם כשהקוד שלך לא רץ, והרבה מאוד טריקים בjavascript מתבססים על זה. וזה בדיוק מה שהתכוונתי אליו כשאמרתי ״אתה תמצא את עצמך מחפש דרכים לייצר מקביליות איפה שאין״. אני מכיר מתכנתי front end שעושים לולאות באוויר כדי לייצר את המקביליות החסרה הזאת בJS - והם מצליחים איכשהו.
 

TotalCommnader

New member
לא נתקלתי בצורך בMT ב3 החברות שעבדתי בהן.

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

גם אם זה מצב מייצג המסקנה שלי הפוכה! כן להכיר את זה!

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

hadooper

New member
התשובה היא כן, בהחלט!

ממה שאני נתקלתי, אפילו במערכות תוכנה שיש שיגדירו אותם כטריוויאליות יחסית ולא מתוחכמות במיוחד, תמצא קרוב לוודאי איזור שקיים בו רכיב שדורש מיקבול חכם, לפעמים עד כדי כך שצריך להתאים עבורו פתרון די ייחודי.
&nbsp
כלומר, במקרים מסויימים זה יכול להסתיים בכך שתמצא פריימוורק שעונה בדיוק על המטרה וכבר עושה הכל בשבילך (נניח quartz לתזמון של מטלות שתרוצנה ברקע). באחרים, תיאלץ לכתוב קוד מקבילי ישירות עם שימוש בקידוד טהור בשפה שאיתה אתה עובד (ב JDK 8 למשל נכנסו כל מני high level primitives חדשים לתכנות מקבילי).
 

zaske

New member
jdk5 , אבל בקטנה

אתה בטח מתכוון ל forkJoin שנכנס ב8 (או איך שלא קוראים לזה ), ול Phaser למשל, אבל java.util.concurrent איתנו כבר מ jdk5

ושוב, תלוי בעבודה.
 

hadooper

New member
גם, אבל גם...

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html
&nbsp
ועוד כל מני יכולות פרלליות מעל Stream.
&nbsp
למעשה, כשאני חושב על זה, רוב השימוש שלי במיקבול עד היום היה בעיקר אסינכרוניזציה בעבודה עם data באופן כללי (כחלק ממה שנקרא "תכנות ריאקטיבי"), מימוש של דברים בגישה אופטימיסטית ופחות בהתעסקות עם דברים שקשורים בסנכרון ונעילות מסוגים שונים.
 
לא, זה לא לחם וחמאה של כל מתכנת

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

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

zaske

New member
תלוי מאוד מה המערכת עושה

כעקרון כן, אתה אמור לדעת ולהכיר.
באיזו רמה? כמה שיותר , יותר טוב.
ממליץ על הספר a little book on semaphores אם שמו זכור לי נכון -
א. הוא חינם
ב. מראה איך מממשים חלק מאובייקטי הסינכרון וכתוב טוב לדעתי
ג. לא ארוך

לגבי דיבוג - תלוי בסביבה, אתה יכול ב java להוציא את ה thread dump. הדפסות זה קצת מסוכן כי זה יכול לגרום ל context switch מיותר.

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

choo

Active member
שכיח למדי (אבל לא בכל מקום) - ולא תמיד באותה רמת מורכבות

&nbsp
ריבוי חוטים מהווה דרך חשובה לנצל את ריבוי הליבות וריבוי המעבדים במחשבים שונים.
&nbsp
אפליקציה שמעוניינת להשתמש ביותר ממעבד אחד על המחשב שעליו היא רצה - צריכה להשתמש בריבוי חוטים או בריבוי תהליכים.
&nbsp
מאחר והנטיה כיום להגברת ביצועי החומרה היא הוספה של ליבות, ולא העלאת תדר (זה נכון בתחום השרתים והדסקטופים, זה הגיע גם לסמארטפונים - זה קיים בצורה מצומצמת בהרבה במערכות משובצות מחשב - למרות ששם לפעמים יש ריבוי מעבדים לא-סימטריים) - השימוש בכלים של ריבוי חוטים ו/או תהליכים - גדל, וסביר שימשיך לגדול.
&nbsp
בין ריבוי חוטים לריבוי תהליכים - לריבוי חוטים יש תקורה נמוכה יותר מבחינת צריכת זכרון ומבחינת ביצוע context switch (לא צריך להחליף את כל מיפוי הזכרון הוירטואלי במעבר בין חוטים שונים) - בהרבה מקרים ריבוי חוטים מועדף על פני ריבוי תהליכים (המקום שבו לריבוי תהליכים יש יתרון משמעותי הוא במערכות scale-out - שאמורות להיות מסוגלות לרוץ על מספר שרתים הולך וגדל - ריבוי חוטים כשלעצמו לא מאפשר הפעלת התוכנה על יותר משרת אחד)
&nbsp
מצד שני, מורכבות השימוש בריבוי חוטים - משתנה בין מקומות שונים ובין תעשיות שונות. יש תחומים שבהם יש הרבה חוטים שעובדים על מבני נתונים משותפים שמשתנים תדירות במהלך הריצה - וצריכים הרבה תאום ביניהם. יש תחומים שבהם החוטים עובדים בעיקר בצורה של pipeline - כל חוט מקבל משימה מתוך תור, מעבד אותה, ומעביר לתור של חוט אחר להמשך ביצוע - ללא עבודה על מבני נתונים משותפים מעבר לתור המשימות של כל חוט.
&nbsp
הצורה האחרונה היא ככל הנראה מאוד שכיחה במערכות משובצות ומערכות זמן אמת בעלי משאבי זכרון וכח מיחשוב נמוכים יחסית (לפחות על פי מה שאנשים שמגיעים משם מתארים בראיונות עבודה) - בין אם בתוכנה שרצה בתוך טיל, תוכנה שרצה בתוך טלפון שולחני וכן הלאה.
 

zaske

New member
חלק גדול ממה שאתה כותב ישים גם למערכות עם מספר nodes

יעני קלאסטר.
נו, אז מה, עכשיו הוא גם יפסול קלאסטרים?

בזמנו , כשהתראיינתי לאמאזון היתה שאלה אגב שהפתרון שלה כלל גם שימוש ב multi threads וגם פתרון של scale out ברמה של nodes .
 
כן אסינכרוניות זה בסיסי ממש ממש. thread זה פרט מימוש מעצבן.

על זה אומרים ב-#C:
If you're using Threads, you're already writing legacy code.
 

vinney

Well-known member
אפשר להרחיב את זה קצת יותר

If you're using C#, you're already writing legacy code.
&nbsp
 

zaske

New member
אצלנו

המערכת שלנו היא SaaS , בגדול ערב רב של טכנולוגיות כי הקוד התחיל לפני 15 שנים, אבל הפיתוח האחרון הוא ב jdk8 ו angular.js .

רוב רוב רוב הבקשות הן מאוד קצרות, ולכן לא תמצא לאורך ה flow שום דבר שקשור ב multi threaded.

כן יש רכיב חיצוני שעושה עיבוד מידע (שלוקח זמן) ששם תמצא את זה, וכן תמצא את זה גם במוצר הליבה בכל מקום שלוקח זמן. בין אם זה על ידי שימוש ב אובייקטי סינכרון ו patterns אחרים שקשורים לנושא שמומשו ב java.util.concurrent ובין אם זה על ידי שימוש ב"ספריות חיצוניות".
 

BravoMan

Active member
לא תתחמק מזה...

התעשייה אומנם רחבה, אבל גם אם תיקח משהו שנראה טריוויאלי - יישומון Android פשוט, תמצא שאתה עדיין צריך MT.
אומנם, המערכת מספקת לך כלים נוחים כמו AsyncTask שמחביא ממך את רוב המורכבות שבעבודה עם נימים שונים ורוב המטלות לא באמת דורשות נעילות וסנכרון נתונים, אבל גם כן, כמו בכל יישום GUI, ברגע שאתה עושה משהו שלוקח זמן - אפילו בקשת Web פשוטה, אסור לך לעשות זאת על ה-thread הראשי שמחזיק את הממשק.
&nbsp
למעשה - הם לקחו את זה כ"כ רחוק שאם תנסה לייצר תקשורת על ה-thread של ה-GUI תקבל Exception.
 
למעלה