משתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?
-
אני באמצע פרויקט שירוץ בעז״ה על docker
העניין הוא שאני רוצה לערוך שינויים באמצע דרך אתר חיצוני.אז זה מתחלק לשניים.
- פרטים שלא משתנים כמעט (כמו מספר מערכת וסיסמה בימות המשיח שממנו אני מוציא את השיחות, וכן הגדרות מערכת שכמעט ולא משתנות.)
- פרטים שעשויים להתעדכן בתדירות גבוהה יותר (כגון רשימת הערים שיכולות להצטרף לפרויקט, השעות בהם זה ״לילה״ ואני לא שולח שם צינתוק, או שעות שזה שבת, ואני לא שולח )
העניין הוא שכשמעדכנים את זה, זה חייב להשתנות בקוד באותו רגע.
חשבתי על 3 פתרונות ואשמח לדעת מה עדיף.- שמירה במסד נתונים , וכל פעם לעשות קריאה מחדש (מאות/אלפי קריאות ביום לsqlite)
2 קובץ .env ששם להכניס את הכל, ולקרוא לו כל פעם , ואותו לערוך (כמו המסד נתונים רק בקובץ שזה קריאה יותר זריזה, ופחות כבדה.)
3 מסד נתונים/ קובץ, אבל לא לקרוא להם כל פעם, אלא בתחילת הקוד לאתחל את המשתנים, ואם יש שינוי, אני יקריס את הדוקר, ויעלה אותו שוב.
הפרויקט מריץ flask, ולכן אם אני טוען מראש משהו מלפני שמתחיל האפליקציה של flask עצמה, הוא לא יטען אותו בכל ריצה מחדש אלא רק באיתחול.נראה לי ש 2 בכל מקרה עדיף על 1 כי זה פחות עומס על השרת.
אבל בין 2 ל 3 אני מתלבט כי זה פשוט להקריס דברים, ולא נשמע לי שזה הדרך מצד שני זה בלי קריאות בכלל חוץ מבעת עדכון.
אולי צריך לשלב את שתי הצורות בין הדברים שכמעט ולא מתעדכנים לבין הדברים שמתעדכנים יותר הרבה פעמים?
לכל דרך יש פה מעלות וחסרונות, אשמח לשמוע מה עדיף.
או שבכלל יש דרך 4 שחברי הפורום יוכלו להחכים אותי בה?
הקוד כתוב בפייתון. והמסד נתונים הוא sqlite
-
@צבי-ש כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
מאות/אלפי קריאות ביום לsqlite
זה כלום (אבל גם הכלום הזה מיותר, עיין להלן)
כמו המסד נתונים רק בקובץ שזה קריאה יותר זריזה, ופחות כבדה
https://www.sqlite.org/fasterthanfs.html
הם טוענים שהם יותר מהירים ממערכת הקבצים
אבל בסדר גודל שלך ההבדל הוא אינפיניטסימלי (ובעברית: לא רלוונטי כלל)או שבכלל יש דרך 4 שחברי הפורום יוכלו להחכים אותי בה?
סתם מחשבה שעולה לי, תוכל לעשות פוקנציה שמרעננת את ההגדרות מקובץ ההגדרות או מסד הנתונים, איזה מהם שיהיה, לא משנה, ותעשה URL בשרת שקריאה אליו יפעיל את הפוקנציה
-
@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
סתם מחשבה שעולה לי, תוכל לעשות פוקנציה שמרעננת את ההגדרות מקובץ ההגדרות או מסד הנתונים, איזה מהם שיהיה, לא משנה, ותעשה URL בשרת שקריאה אליו יפעיל את הפוקנציה
את זה ניסתי להגדיר בלשוני כאן
@צבי-ש כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
3 מסד נתונים/ קובץ, אבל לא לקרוא להם כל פעם, אלא בתחילת הקוד לאתחל את המשתנים, ואם יש שינוי, אני יקריס את הדוקר, ויעלה אותו שוב.
הפרויקט מריץ flask, ולכן אם אני טוען מראש משהו מלפני שמתחיל האפליקציה של flask עצמה, הוא לא יטען אותו בכל ריצה מחדש אלא רק באיתחול.אבל איך אני יכול לרענן את ההגדרות?
ההגדרות הם במשתנים,אני פשוט יגדיר אותם מחדש?כלומר בריצת הקוד בהתחלה יהיה טעינה רגילה, ואם מגיע בקשת עדכון, אני פשוט יגידר מחדש את כל המשתנים? זה לא יהיה מוגבל רק לתוך הפונקציה ההגדרה של המשתנים?
@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
הם טוענים שהם יותר מהירים ממערכת הקבצים
תודה על העדכון, זה ממש משנה לי את הצורת עבודה, לטובה.
-
@צבי-ש כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
את זה ניסתי להגדיר בלשוני כאן
@צבי-ש כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:3 מסד נתונים/ קובץ, אבל לא לקרוא להם כל פעם, אלא בתחילת הקוד לאתחל את המשתנים, ואם יש שינוי, אני יקריס את הדוקר, ויעלה אותו שוב.
הפרויקט מריץ flask, ולכן אם אני טוען מראש משהו מלפני שמתחיל האפליקציה של flask עצמה, הוא לא יטען אותו בכל ריצה מחדש אלא רק באיתחול.האמת שלא הבנתי בדיוק את כוונתך בשורה זו:
.
הפרויקט מריץ flask, ולכן אם אני טוען מראש משהו מלפני שמתחיל האפליקציה של flask עצמה, הוא לא יטען אותו בכל ריצה מחדש אלא רק באיתחול.בכל מקרה אני לא מציע להקריס שום דבר, זה באמת פתרון עקום
כלומר בריצת הקוד בהתחלה יהיה טעינה רגילה, ואם מגיע בקשת עדכון, אני פשוט יגידר מחדש את כל המשתנים?
כן, בדיוק כך
זה לא יהיה מוגבל רק לתוך הפונקציה ההגדרה של המשתנים?
אם אתה לא מרענן אותם בכל קריאה לפונקציה שמשתמשת בהם, בהכרח הם לא לוקליים לפוקנציה ההיא, אלא הם ב-scope שהוא רמה אחד למעלה מהפוקנציה שמשתמשת בהם, אז תעשה ב-scope ההוא עוד פונקציה שמעדכנת אותם במקרה הצורך
גוט שאבעס
-
@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
אם אתה לא מרענן אותם בכל קריאה לפונקציה שמשתמשת בהם, בהכרח הם לא לוקליים לפוקנציה ההיא, אלא הם ב-scope שהוא רמה אחד למעלה מהפוקנציה שמשתמשת בהם, אז תעשה ב-scope ההוא עוד פונקציה שמעדכנת אותם במקרה הצורך
אבל אם הפונקציה תגדיר אותם מחדש ההגדרה לא יהיה שייך לפונקציה עצמה?
הוא יצא גם לסקופ?@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
גוט שאבעס
גוטע וואך
-
@צבי-ש אביא לך דוגמה:
קובץsettings.py
_settings = db.get_settings() def get(setting): return _settings[setting] def refresh_settings(): global _settings _settings = db.get_settings()
קובץ
callback.py
import settings def calculate_callback_time(call_time): night_hours = settings.get("night_hours") return ... # your logic
-
@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
@צבי-ש אביא לך דוגמה:
קובץsettings.py
_settings = db.get_settings() def get(setting): return _settings[setting] def refresh_settings(): global _settings _settings = db.get_settings()
קובץ
callback.py
import settings def calculate_callback_time(call_time): night_hours = settings.get("night_hours") return ... # your logic
תודה רבה.
-
@צבי-ש
רק אציין משהו שהשבוע שמתי לב בעצמי תוך כדי עבודה.
הרבה פעמים אני מוצא את עצמי מתמקד בלתכנן קוד שיהיה הכי נכון מבחינת ביצועים, אבל, אני גם "מבזבז" זמן חשוב וגם לפעמים מגביל את עצמי ויוצא פחות גמיש.לעצם שאלתך, הגדרות שאתה הולך לערוך דרך האפליקציה עצמה - צריכים להישמר ברמת האפליקציה - קרי, במסד נתונים.
הגדרות שאתה הולך לערוך מחוצה לו - שמור במשתני סביבה או בקובץ הגדרות.
ואחרי עריכה - ריסטארט לאפליקציה. -
@yossiz כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
@צבי-ש אביא לך דוגמה:
קובץsettings.py
_settings = db.get_settings() def get(setting): return _settings[setting] def refresh_settings(): global _settings _settings = db.get_settings()
קובץ
callback.py
import settings def calculate_callback_time(call_time): night_hours = settings.get("night_hours") return ... # your logic
https://github.com/dribia/driconfig
אני משתמש בזה במעל 90% מהפרויקטי פייתון שלי.
הרווח הגדול הוא שאתה מקבל ולידציה על ההגדרות + type hints -
@aaron כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
ואחרי עריכה - ריסטארט לאפליקציה.
לא תמיד זה נכון / אתה רוצה לעשות ריסטארט לאפליקציה,
אל תשכח שאתה לא ידוע ברגע שעשית ריסטארט איזה בקשות זרקת לפח, או לחילופין איזה בקשות כעת נפלו ואין גישה כי האפליקציה לכמה שניות למטה.
באפליקציות מסויימות זה יכול להיות קריטי בעיקר באמצע היום.אני מאד מתחבר דווקא להצעה של @yossiz לעשות לינק שמרפרש את ההגדרות מהDB (או מכל מקור אחר)
-
@clickone כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
(או מכל מקור אחר)
@צבי-ש דיבר על שימוש בדוקר, לערוך את הקבצי הגדרות בלי לעשות ריסטארט לקונטיינר לא יטען את השינוים.
תשתמש ב gunicorn כדי שיטפל ב graceful shutdown. וLB כדי שישאר סרוויס זמין בזמן הזה, אבל באמת לא חושב שזה חשוב לך עד כדי כך..
כמובן שלטעון מהDB זה גם אפשרות, לדעתי צריך לטפל בsignals בכל מקרה, כך שאין סיבה להשתמש בDB ולא בקובץ הגדרות.
-
@aaron כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
@clickone כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
(או מכל מקור אחר)
@צבי-ש דיבר על שימוש בדוקר, לערוך את הקבצי הגדרות בלי לעשות ריסטארט לקונטיינר לא יטען את השינוים.
תשתמש ב gunicorn כדי שיטפל ב graceful shutdown. וLB כדי שישאר סרוויס זמין בזמן הזה, אבל באמת לא חושב שזה חשוב לך עד כדי כך..
כמובן שלטעון מהDB זה גם אפשרות, לדעתי צריך לטפל בsignals בכל מקרה, כך שאין סיבה להשתמש בDB ולא בקובץ הגדרות.
@צבי-ש כתב במשתנים יציבים שעלולים להשתנות מידי פעם. איך הדרך הנכונה להגדיר אותם?:
העניין הוא שאני רוצה לערוך שינויים באמצע דרך אתר חיצוני.
ככל שזה הסיבה, אז ודאי שלשמור בDB. אתה תחשוף API כדי לעדכן את המידע ובאותו קריאה גם לטעון את המידע החדש.