JS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...
-
שלום לכולם!! אני כל כך נהנה מהפורום הזה, ועיקר ההנאה שלי היא מהפורום תיכנות שמכיל כל כך הרבה אנשים איכותיים ונדיבים !! תודה לכולכם, כל מי שעוזר כאן שידע שגם אם לא רואים, יש אנשים ברקע שפשוט קוראים את מה שכתבת וזה מאיץ אנשים כמה צעדים קדימה בכל פעם.
אציין שאני עכשיו במלונית קורונה, יש לי זמן פנוי בשפע אז לקחתי את עצמי ונכנסתי לנוד בפעם ראשונה בחיים, את JS כבר אני מכיר יחסית סביר, אז זה ממש לשחות בקצב טוב. אני נהנה וממש עסוק וזה ויהיה לי אולי הרבה שאלות כאן..
כחלק מה'אפליקציית נוד הראשונה שלי' צריך לעשות שם פרוצדורה כזו בערך -
- יוזר בוחר זמן מסוים ביום, מבין כמה אפשרויות
- זה נשמר ביחד עם כל ההגדרות של היוזר שנמצאות ב-DB (אני משתמש במונגו זה ממש cool הכל ב-JSON)
- אני צריך להוציא כל יום פוש ליוזר (לכל אחד מהיוזרים של המערכת) לפי הזמן שהוא בחר (או מניפולציה מסוימת לזמן שהוא בחר - נגיד - רבע שעה לפני וכד'ו)
מה אני יודע?
להוציא פושים (גם לפי ייוזר ספציפי) לשמור ב-DB וכו' וכו' את כל זה כבר עברתי (היה מגניב).
עכשיו אני בשלב של ה-איך לבצע את החישוב הזה כל הזמן (נגיד כל יום לקראת הזמן הכללי של הפושים, לבצע חישוב כללי על כל היוזרים על ידי לולאה) והרי מה שיוצא מהחישוב על כל היוזרים הוא - זמן שנותר עד הזמן שצריך להוציא לו פוש, מה אני עושה עם זה?
האם פשוט לעשות settimeout המסורתי על המידע הזה, כשמה שיקרה בסוף הטיימאאוט זה הפוש?
למה זה מרגיש לי כזה דיבילי?האם אין דרך כלשהי ב-JS לחכות לאירוע - שהאירוע הזה הוא בעצם התרחשות של זמן מוגדר??
כלומר משהו כזה:onTime(3:00am) {do something}
הבנתם את הרעיון.
אין משהו כזה? אין בעצם אירוע (או אפשרות \ ספרייה \ משהו - שיוצר את האירועים האלו כך שאוכל להשתמש בהם בצורה דומה למה שכתבתי?)
אם יש למישהו איזושהי תובנה או תוכחה על הטיפשות שלי הקטן או פיתרון (!!!) - למה שכתבתי - אני אשמח ואודה לו מאוד.
סורי מכולכם, יש לי כאן זמן ורוגע אז כתבתי באריכות
השתדלתי לכתוב ברור, יש שאלות תכתבו! תודה @chv -
אני לא במלונית.. רק אתן מראה מקום..
https://www.npmjs.com/package/node-schedule
תתקין את הספריה ואתה יוצר אובייקט שיופעל בשעה הרצויה
יש תיעוד בשפע..
בהצלחה והבראה נעימה -
@chv שאלה יפה מאוד, היא באמת ארוכה כי השאלה לטעמי היא "איך מתזמנים פעולה בנוד לזמן מסויים".
וזה בעצם לא שאלה דוקא בנוד, זה ראשית שאלה כללית ברמת תוכנה, וספציפית יותר ברמת תוכנת שרת.
הספריה ש@חוקר הביא נראת מצויינת, היא מקבלת את הפורמט של cron שהוא מתזמן המשימות של לינוקס והפורמט שלו מפורסם וקל. מעניין אותי איך הספריה הזו מבצעת את הפעולה מאחורי הקלעים, אולי היא עושה setTimeout מחושבים? לא יודע.
שים לב שבספריה הזאת בהפעלה מחדש של האפליקציה הכל "מתנקה", תצטרך לדאוג לטעון חזרה את המשימות בטעינת האפליקציה.בהצלחה רבה בנוד, אחת מהבשורות הגדולות של התוכנה בשנים האחרונות.
-
@dovid אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
שים לב שבספריה הזאת בהפעלה מחדש של האפליקציה הכל "מתנקה", תצטרך לדאוג לטעון חזרה את המשימות בטעינת האפליקציה.
שים לב ש(לפחות ניסתי ל-)הסביר שאני כן משתמש ב-interval מסוים - פעם ביום וכדו' - כדי לחשב את הנתונים מהם אני רוצה לייצר טיימאאוטים.
כלומר אני צריך כל יום לשלוח פושים ליוזרים והפושים הללו צריכים להיקבע כל יום ספציפית. לכן כל יום אני מריץ אינטרוול שיחשב את התזמון (שהוא אינדיבידואלי לכל יוזר, כל אחד מה שהגדיר) ואז אני צריך לקבוע כמויות של טיימאאוטים - מזה נרתעתי - מהטיימאאוטים המרובים (שגם אני לא יודע עד כמה מבחינת פרפורמנס זה משפיע בכלל??).
אז בשביל הטיימאאוטים רציתי משהו יותר מוצלח מ-settimeout הגנרי.כך שלא מפחיד אותי שמתאפס כל פעם בהרצה של האפליקציה.
@חוקר אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
אני לא במלונית.. רק אתן מראה מקום..
https://www.npmjs.com/package/node-schedule
תתקין את הספריה ואתה יוצר אובייקט שיופעל בשעה הרצויה
יש תיעוד בשפע..
בהצלחה והבראה נעימהתודה על השקעת הזמן, וזה אכן נראה טוב (עד כמה שאני יכול להעריך בחוסר הידע שלי..)
אני אשב על זה.
תודה@dovid אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
בהצלחה רבה בנוד, אחת מהבשורות הגדולות של התוכנה בשנים האחרונות.
מקווה, אני בנתיים נהנה מכל שלב של כניסה לעניין. מרגיש כמו יין חדש-ישן.
-
יש לי איזה הערה ממש ממבט ראשון על החבילה הזו (schedule)
כבר שראיתי את השם נצנץ לי.
החבילה הזו בעיקרון יוצרת אינטרוולים. כלומר - יש לה יכולות מפותחות, אז היא יוצרת אינטרוולים מפותחים עם תנאים לא מצויים באינטרוול הקלאסי של JS. אבל בתכלס זה אינטרוולים.
זה לא טיימאאוטים.
אני טועה?כלומר - אולי אוכל לרתום אותה לצרכיי, אבל לא זה היעוד המקורי שלה, ויכול להיות שזה סתם הכבדה ויש פתרון אחר יותר חכם?
שואל. -
@chv אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
אבל בתכלס זה אינטרוולים.
זה לא טיימאאוטים.למיטב המחקר שחקרתי את הספריה מלמעלה.
זה טיימאאוט.
הוא בודק פעם אחת את הזמן הנוכחי לעומת הזמן שאתה אמור להריץ את זה ומפחית את הזמן הנוכחי ונותר לו שיש להריץ טיימאאוט בעוד ההפרש של הזמן.
גם בכרון שחוזר על עצמו, בכל ריצה הוא בודק מתי יהיה הפעם הבאה שירוץ, ומגדיר כבר עכשיו טיימאאוט לעוד כך וכך זמן.א"כ הרעיון פשוט אם אתה רוצה לעשות משהו הכי רזה אתה בודק פעם ביום לכל המשתמשים באיזה שעה הם אמורים לקבל את ההתראה, אתה עושה חישוב של השניות של זמן ההתראה מינוס זמן נוכחי = ההפרש שאותו אתה מגדיר בטיימאאוט שירוץ בעוד כך זמן.
ייתכן שנמצא שאתה ממציא גלגל הקיים בלאו הכי בתוך המעטפת של הספריה, וא"כ לא יהיה הבדל גדול בביצועים.@dovid אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
אולי היא עושה setTimeout מחושבים?
נראה לי שזה מה ש @dovid התכוין במשפט הקצר והקולע
-
@chv יש שמה בדוגמאות הפעלה חד פעמית של פעולה (עם תאריך קשיח שנה תאריך ושעה).
@חוקר אני התכוונתי setTimeout אחד לעוד חמש חודשים... אבל גיליתי שאי אפשר יותר מ25 יום... (אלא"כ עושים setTimeout רקורסיבי, לא טוב).
אז אם כבר צריך לעשות משהו פעם ביום, אז אפשר ללכת על בדיקה מתמדת עם setInterval של פעם בדקה וכדומה. אני מחפש באינטרנט ואני מוצא כאלה כיוונים:
How to set up 6 month timer in node.jsבאופן כללי בנוד אני תמיד לוקח ספריה, אם אני רואה שהיא בשימוש מסיבי וללא מתחרים חכמים יותר.
-
לדעתי, כל ועוד מדובר סה"כ לפרויקט לימודי, אז יש שני גישות,
או ליישם פתרון הכי low level, כדי באמת ללמוד את השפה ואת המגבלות שלה,
או להשתמש בספרייה הכי פעילה (מבחינת פיתוח) ופופולרית, להשתמש בה ולהתקדם הלאה.בתכלס, אם באמת היה מדובר באפליקציה גדולה, לדעתי מה שנכון זה להוציא החוצה את נושא תזמון המשימות.
יש פתרונות חזקים שיתנו סט כלים ופיצרים רחב, שחבל להשקיע עצמאית, וכללית כדאי להפריד..אני לא מתכנת בnode, אבל זה השנקל שלי..
-
@aaron אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
בתכלס, אם באמת היה מדובר באפליקציה גדולה, לדעתי מה שנכון זה להוציא החוצה את נושא תזמון המשימות.
אני גם נטיתי לחשוב ככה אבל בגלל השאלה פה קצת חשבתי יותר, וכעת אני חושב שדוקא הsetInterval אין לו שום חיסרון, לעומת שימוש במערכת חיצונית שיש לזה כמה חסרונות: פיזור המערכת על פני כמה גורמים, תקשורת, תלות בפלטפורמה ועוד.
-
@dovid
לא זוכר אם זה דעה שלך או לא, אבל מאנדהו פה בפורום טוען שאפליקציות נוד מראש מיועדות לטווח חיים קצר..אולי תפרט יותר למה לדעתך intrval פנימי מספיק טוב?
אני דיי מתקשה להבין\להסכים עם הרעיון..
העולם היום הרבה יותר בעד פיזור למרות החסרונות של תלות בתקשורת, פלטפורמה וכו'
העולם הוא לא סוף פסוק, אבל אני מניח שמאחורי הדעה יש הרבה מחקר ומסקנות.. -
@aaron לא יודע אם זה שווה דיון, אני די מסכים אם כל הצדדים, אבל אם אתה רוצה אסביר לך את עצמי.
טווח החיים לא רלוונטי, כי בטעינת האפליקציה הוא מפעיל שוב את הInterval.
אפליקציית נוד בהחלט עשויה לעבוד כל הזמן, זה הרי בראש ובראשונה תוכנת שירות http.למה אינטרוול זה טוב? כי הוא זול מאוד. נוד בנויה לקבל המווווון אירועי קלט בלי למצמץ וזה ממש כלום בשבילה אירוע של פעם בשניה לבדוק אם השעה הנוכחית נמצאת במילון. זה כמו פעולה חיבור וחיסור במחשבון - זה זול, וזה טוב.
העולם בעד פיזור זה נכון, של מיקרוסרויסים. אני לא חושב שקרון זה הפיזור בכיוון הזה אבל אתה צודק שאני פחות בקטע הפופולרי הזה ויותר בעד ריכוזיות וניידות, כשאתה מעביר אפליקציית נוד אתה רוצה לדעת שיש לה כמה שפחות תלויות סביבתיות.
-
@dovid אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
טווח החיים לא רלוונטי, כי בטעינת האפליקציה הוא מפעיל שוב את הInterval.
זה נכון אבל זה אומר יותר קוד שצריך לכתוב בעצמך והתייחסות למקרי קצה.
(מהניסיון שלי בקרון בפייתון, יש הרבה מקרי קצה, שלנהל אותם לבד זה ודאי לא אידיאלי.. אבל זה כמובן תלוי פר אפליקציה.
לדוג', אפליקציה שאחראית להעלות קבצים למערכת IVR לפי תזמון, אתה לא רוצה להריץ בו זמנית יותר מX פעולות, כי המשאבים לא מספיקים להמרה לדוג', או לטפל במה קורה עם הזמן להרצה התפספס, מתי להריץ או האם בכלל..)@dovid אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
כשאתה מעביר אפליקציית נוד אתה רוצה לדעת שיש לה כמה שפחות תלויות סביבתיות.
העולם לא מפחד מזה כי ביחד עם המיקרוסרוויסים הגיע התחום של דוקר וk8s..
-
@aaron אני לא מבין לעומק כלל, לא בנוד ולא בפייתון, אבל האין זאת שפייתון ונוד הן שני עולמות שאינם מתחברים?
לא יודע להסביר מעומק העניין - אבל לפחות מלמעלה אני יכול לומר .
לא חולק עליך כי אין לי מספיק הבנה בתחילת קצהו של כל אחת מהפלטפורמות האלו.אגב אני בסוף כן לקחתי את ה-schedule, אבל פשוט כדי ליצור interval כל יום בשעה מסוימת.
-
@chv אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
אבל האין זאת שפייתון ונוד הן שני עולמות שאינם מתחברים?
הם שני עולמות, אבל בתכנון ארכיטקטורה הכל מתחבר..
השאלה היא עקרונית האם להפריד בין מערכות וליצור תלויות, או לרכז הכל ביחד וליצור קוד בייס גדול ומורכב.. -
שכחתי מהאשכול הזה..
הנה מה שבניתי.. 'אפליקציית נוד הראשונה שלי' (yay )
הועלה להרוקו https://chvsunset.herokuapp.com/
אשמח להערות הארות גערות וכו'
CSS באדיבות @Men770 , הרבה הרבה עזרה והסברים מעמיקים (ונזיפות מוצלחות) מהגה"צ @yossizהקוד בגיטהב https://github.com/chaim-chv/zmanim-node
שוב - הארות וכו'המשך יום\לילה\יממה כללית נעימה לכולם
-
@www אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
@chv יפה מאד!
אם אני מבין נכון, אתה בכל פעם בודק את שם העיר בגוגל מפס, אני הייתי שומר את הנתונים באיזה DB / קובץ JSON או לפחות בזכרון, כי זה בעצם עוד בקשת אינטרנט שמאריך את זמן התגובה באתר.יותר נכון - בודק את ה-lat-long (קואורדינטות) של העיר (עם google geolocation API) כי הספרייה של בדיקת זמני הלכה (kosher-zmanim) דורשת את הנתונים האלו.
צודק בקשר למהירות - אכן רעיון לשמור כל בקשה שהצליחה - לאחסן אותה ב-DB. (בהמשך.. יש לי עכשיו מה לעשוץ)
אגב אני לא יודע עד כמה זה ישפר מהירות, ה-DB הזה וההתקשרות איתו לא ככ מוכיחים את עצמם בקטע של מהירות. גוגל דווקא מהיר. (אני משתמש במונגוDB של מונגו עצמם, כלומר מנוהל - מאוחסן אצלם, תוכנית חינמית. כנראה התוצאות בהתאם. פעם היה בהרוקו תוכנית חינמית של מונגוDB, זה הופסק בנובמבר האחרון. מכה קשה להרבה גיקים הודים, ולי (כיום יש רק תוכנית חינמית של postgresql.. חשבתי ללמוד את זה באמת, רק בגלל שיש לי שם תוכנית חינמית.. וגם כי @yossiz יוכל הרבה יותר לעזור לי ... )
-
@chv אני הייתי טוען לזכרון, ובמקביל שומר בקובץ JSON מקומי, וטוען את הJSON לזכרון בעת עליית האפליקציה.
@chv אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
יותר נכון - בודק את ה-lat-long (קואורדינטות) של העיר (עם google geolocation API) כי הספרייה של בדיקת זמני הלכה (kosher-zmanim) דורשת את הנתונים האלו.
לזה התכוונתי.
בספריות אחרות (כמו HEBCAL) יש כבר מערך של ערים נפוצות, רק הבעיה שיש טעויות הקלדה ושפות. -
@www אמר בJS | תזמון, המתנה לזמן מסוים להרצת פעולה - אבל לא settimeout...:
@chv אני הייתי טוען לזכרון, ובמקביל שומר בקובץ JSON מקומי, וטוען את הJSON לזכרון בעת עליית האפליקציה.
אה זה רעיון! לא חשבתי על זה בכלל. זה כאילו ליצור לעצמי DB פרטי במבנה ובסכמות שאני מחליט..
אני יבדוק זה נשמע לי מעניין.