ניטור כמות הgoroutines הפעילים בפונקציה
-
@dovid
קודם כל מצאתי את הפתרון
צריך להשתמש בmutex.Lock()
וזה עובד מצוייןpackage main import ( "fmt" "sync" "time" "github.com/gofiber/fiber" ) var mutex = &sync.Mutex{} func main() { app := fiber.New() // Match any route app.Get("/:number", func(c *fiber.Ctx) { number := c.Path() str := []byte(number) go myfunc(string(str)) c.Send(number) }) app.Listen(3000) } func myfunc(number string) { fmt.Printf("number is %s\n", number) mutex.Lock() fmt.Printf("number is now %s \n", number) time.Sleep(3 * time.Second) mutex.Unlock() }
לגבי אסטריסק לא ידוע לי על אפשרות לדעת מה הסטטוס של השיחה
הדרך היחידה ש @שואף מצא היא פשוט להגביל את מספר הבקשות לדקה.בכל מקרה מה שאני מנסה לבנות זה לאו דווקא שישחרר את הנעילה אחרי X דקות
אפשר גם להתנות משהו אחר, למשל תשובה מהAPI המבוקש
בכל מקרה הדרך הכי קלה לדיבוג זה עם Sleep.אגב בדיוק נתקלתי בעוד שימוש לשרת כזה
אני חשבתי לקנות חבילת TTS של עלמא רידר וכיוון שאני לא צריך את החבילות הגדולות שלהם (מינימום 2100 ש"ח)
חשבתי לעשות ריסייל ולמכור חבילות קטנות יותר
הבעיה היא שבמחירון שלהם כתוב שהם מגבילים את הכמות בקשות בו זמנית לכל חשבון (2 בקשות בחבילה הבסיסית)
והשרת הקטן שאני מנסה לבנות אמור לפתור את הבעיה
(את הקובץ שמע שאני מקבל מעלמא רידר אפשר להחזיר בPOST נפרד חזרה למבקש) -
מה שעשית אומר שלעולם לא יבוצעו שניים יחד, אם יש 3000 ביחד הם ישוחררו אחד אחד, כלומר תוך 9000 שניות. אני חושב שזה דרך רעה אבל לא נראה שזה הולך לשכנע אותך.
סקרנות: הקובץ בתיקיית השיחות נשאר לנצח?עוד הערה, ייתכן שהgo myfunc מיותר, תוכל לשנות את סדר השורות שsend יהיה ראשון כך שמייד תחזור תשובה, ואחריה myfunc ללא gorutin.
בקשר לmutex.Unlock, כדי לא לשכוח לשים זאת בסוף הפונקציה אפשר לכתוב זאת מייד אחרי השורה של הmutex.Lock רק להוסיף בראש השורה את המילה defer שמשמעותה לדחות את הביצוע עד סוף הפונקציה הנוכחית. -
גם התקשורת עם asterisk בעזרת קבצים נראה לי הכי פרימטיבית מבין האפשרויות שיש פה:
http://the-asterisk-book.com/1.6/asterisk-fernsteuern.html
https://wiki.asterisk.org/wiki/display/AST/Interfaces
אני מציע לשחק עם האפשרויות האחרות ולהשיג שליטה יותר טובה. -
@dovid אמר בניטור כמות הgoroutines הפעילים בפונקציה:
מה שעשית אומר שלעולם לא יבוצעו שניים יחד, אם יש 3000 ביחד הם ישוחררו אחד אחד, כלומר תוך 9000 שניות. אני חושב שזה דרך רעה אבל לא נראה שזה הולך לשכנע אותך.
זה בדיוק מה שאני צריך שזה יקח 9000 שניות ולא פחות (אפשר להגדיר פחות משניה אם צריך).
סקרנות: הקובץ בתיקיית השיחות נשאר לנצח?
לפי מה ששואף טען הקובץ נמחק מתי שהוא.
גם התקשורת עם asterisk בעזרת קבצים נראה לי הכי פרימטיבית מבין האפשרויות שיש פה:
https://wiki.asterisk.org/wiki/display/AST/Interfaces
אני מציע לשחק עם האפשרויות האחרות ולהשיג שליטה יותר טובה.אני לא מומחה לאסטריסק ואני פועל על פי מה ש @שואף ו @WWW אמרו.
יכול להיות שיש דרך יותר טובה לשלוח הודעות
אבל זה לא סותר את הנקודה שצריך שליטה על הבקשות לפני שהם מגיעים לAPI של אסטריסק. -
@nigun אמר בניטור כמות הgoroutines הפעילים בפונקציה:
יכול להיות שיש דרך יותר טובה לשלוח הודעות
אבל זה לא סותר את הנקודה שצריך שליטה על הבקשות לפני שהם מגיעים לAPI של אסטריסק.ה"שליטה" עליה אתה מדבר היא גישוש באפילה.
אם יש הגבלות כל שהם לכמות השיחות המקבילות (?) צריך לדעת בדיוק מה היא ולפעול בהתאם.
בשליחת הודעות בדרך אחרת, אתה כפי הנראה יכול לקבל סטטוס מדוייק מה קורה, ולפי זה להחליט מתי לשלוח את הבאה בתור. -
@dovid אני אסביר מה קורה אצלי, כנראה יעזור להבנת העניין.
יש טראנק שמשמש לצינתוקים, הוא מוגבל נגיד ל 50 שיחות יוצאות בו זמנית.
צינתוק מתבצע באמצעות יצירת קובץ עם הנתונים המתאימים, (פקודה לניתוק מיד בעת המענה, וכן משך שיחה נגיד 10 שניות),
עכשיו מה שאני עושה, כשאני היחיד שמוציא צינתוקים, אני דוחף כל 11 שניות 50 קבצים לתיקייה.
(למען האמת אני לא עושה ככה, אלא מייצר כל 50 קבצים עם הפרש של 11 שניות לביצוע.)לא אמור להיות שום בעיה עם זה.
-
@dovid
ההגבלות הם גם מצד הספק טראנק וגם מצד המגבלות של המכונה שלא עומדת בעומס של עשרות שיחות שנענות בבת אחת.
אז הדבר הכי בטוח הוא להגביל את כמות השיחות בו זמנית
למשל אם אני לא רוצה שיהיו יותר מעשר שיחות יוצאות בו זמנית
אני מגדיר שימתין שניה בין שיחה לשיחה ויגביל את אורך הציצול ל10 שניות, וכן הלאה
אמנם אני מפסיד קצת זמן במקרה ששיחה נענת וכרגע יש לי 9 שיחות פעילות, ואני יכול לדחוף עוד שיחה
אפשר להתחיל לנטר את כל השיחות שנענו אבל זה דורש כמובן משאבים וסיבוך נוסף של הקוד, שלא קריטי במקרה שלנו.
(זה שאלה מעניינת האם אפשר לשלוט בפונקציה ולדלג על השינה במקרה שהשיחה נענת אבל זה כבר סיפור אחר)
@WWW
החסרון בשיטה שלך הוא שאתה לא מפזר מספיק את העומסים
וגם מוגבל למשתמש אחד