דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. איך עובד זרמים ב-nodejs

איך עובד זרמים ב-nodejs

מתוזמן נעוץ נעול הועבר תכנות
18 פוסטים 4 כותבים 882 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #2

    res הוא בעצם אובייקט מסוג http.ServerResponse שיורש את הסוג Stream.
    הStream של הקובץ מספק את המתודה pipe ושמה יש קוד פשוט שמקבל ארגומנט מסוג Stream אחר. והוא דואג על כל פיסת מידע שהוא מביא, לעשות write בזרם שהובא לו כפרמטר.

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    1
    • י מנותק
      י מנותק
      יוסף בן שמעון
      כתב ב נערך לאחרונה על ידי dovid
      #3

      תריץ את הקוד הזה ותעקוב אחרי הקונסול:

      var i = 0;
      var obj = {
        on: event => console.log("ON", event),
        once: event => console.log("ONCE", event),
        emit: event => console.log("EMIT", event),
        write: data => console.log("WRITE", i++, data),
        end: () => console.log("END"),
      };
      fs.createReadStream('1.txt', 'utf8').pipe(obj);
      א תגובה 1 תגובה אחרונה
      3
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #4

        @יוסף-בן-שמעון 👍

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        2
        • מנצפךמ מנותק
          מנצפךמ מנותק
          מנצפך
          השיב לאהרן ב נערך לאחרונה על ידי
          #5

          @אהרן אמר באיך עובד זרמים ב-nodejs:

          הארגומנט הוא פונקציה שלתוכו pipe מזריק את הדאטא? הרי res אינו פונקציה?!

          אני מתאר לעצמי שברור לך שב- JS אובייקט ופונקציה חד הם.

          א תגובה 1 תגובה אחרונה
          0
          • א מנותק
            א מנותק
            אהרן
            השיב למנצפך ב נערך לאחרונה על ידי
            #6

            @מנצפך אמר באיך עובד זרמים ב-nodejs:

            @אהרן אמר באיך עובד זרמים ב-nodejs:

            הארגומנט הוא פונקציה שלתוכו pipe מזריק את הדאטא? הרי res אינו פונקציה?!

            אני מתאר לעצמי שברור לך שב- JS אובייקט ופונקציה חד הם.

            NO!

            תגובה 1 תגובה אחרונה
            0
            • א מנותק
              א מנותק
              אהרן
              השיב ליוסף בן שמעון ב נערך לאחרונה על ידי
              #7

              @יוסף-בן-שמעון אמר באיך עובד זרמים ב-nodejs:

              תריץ את הקוד הזה ותעקוב אחרי הקונסול:

              var i = 0;
              var obj = {
                on: event => console.log("ON", event),
                once: event => console.log("ONCE", event),
                emit: event => console.log("EMIT", event),
                write: data => console.log("WRITE", i++, data),
                end: () => console.log("END"),
              };
              fs.createReadStream('1.txt', 'utf8').pipe(obj);
              

              מושלם!
              אז אני מבין שהדאטא מוזרם לתוך פונקצית res.write ובסוף הכל נשלח בבת אחת והחיבור נסגר באמצעות res.end, כפי שרואים בדוגמא הבאה

              app.get('/test', (req, res) => {
                  res.write('OK1');
                  setTimeout(()=>res.write('OK2'),1500);
                  setTimeout(()=>res.end('OK END'),2500);
              })
              setTimeout(()=>{
                  request({url: url}, function (error, response, body) {
                      console.log(body);
                  });
              } ,2.5*1000);
              

              אז מדוע בדוגמא הזאת

              fs.createReadStream(path).pipe(res)
              

              הדאטא מתחיל להישלם מיד עם ההזרמה הראשונה?

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #8

                @אהרן לא, res.write כותב מיידית לזרם הרשת, ולא מחכה לsend.
                כלומר בשתי הדוגמאות זה מתחיל מייד וזה כל המעלה של stream.
                לולי stream אתה קודם גומר לקרוא ורק אז מתחיל לכתוב עם תופעת לוואי של זיכרון גדול. ובסטרים משורשר כל כתיבה כותבת בשרשרת לכל הזרמים.

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                א תגובה 1 תגובה אחרונה
                0
                • א מנותק
                  א מנותק
                  אהרן
                  השיב לdovid ב נערך לאחרונה על ידי
                  #9

                  @dovid
                  אז מדוע בקוד הזה כל הדאטה נשלח בב"א?

                  app.get('/test', (req, res) => {
                      res.write('OK1');
                      setTimeout(()=>res.write('OK2'),1500);
                      setTimeout(()=>res.end('OK END'),2500);
                  })
                  setTimeout(()=>{
                      request({url: url}, function (error, response, body) {
                          console.log(body);
                      });
                  } ,2.5*1000);
                  
                  י תגובה 1 תגובה אחרונה
                  0
                  • א מנותק
                    א מנותק
                    אהרן
                    כתב ב נערך לאחרונה על ידי
                    #10

                    שאלה נוספת

                    encodeStream.pipe(zlibStream).pipe(res);
                    

                    אני מבין שה-pipe השני מזרים את הדאטא הערוך ע"י zlibStream, איפה הוא נשמר בין 2 ההזרמות?

                    מנצפךמ תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי dovid
                      #11

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

                      בקשר לשאלה השניה, אנא קרא את תשובתי הראשונה באשכול. יכולים להיות עשר הזרמות משורשרות, הכתיבה בראשון גוררת כתיבה בכולם. כל אחד מתי שהוא מקבל chunk אחראי לכתוב את זה לסטרים שהוא קיבל כפרמטר בpipe.

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      א תגובה 1 תגובה אחרונה
                      1
                      • א מנותק
                        א מנותק
                        אהרן
                        כתב ב נערך לאחרונה על ידי
                        #12

                        0_1545114797974_c2baf1e8-89c2-4e68-8561-8374e1908168-image.png

                        dovidD תגובה 1 תגובה אחרונה
                        0
                        • מנצפךמ מנותק
                          מנצפךמ מנותק
                          מנצפך
                          השיב לאהרן ב נערך לאחרונה על ידי
                          #13

                          @אהרן אמר באיך עובד זרמים ב-nodejs:

                          שאלה נוספת
                          encodeStream.pipe(zlibStream).pipe(res);

                          אני מבין שה-pipe השני מזרים את הדאטא הערוך ע"י zlibStream, איפה הוא נשמר בין 2 ההזרמות?

                          אני חושב שרק הפונקציה pipe מזרימה stream.
                          write ו - end כותבים בצורה רגילה.

                          תגובה 1 תגובה אחרונה
                          0
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            השיב לאהרן ב נערך לאחרונה על ידי
                            #14

                            @אהרן לא הבנתי למה אתה תוקע את התמונה הזו כתגובה לתשובתי.

                            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                            בכל נושא אפשר ליצור קשר dovid@tchumim.com

                            תגובה 1 תגובה אחרונה
                            1
                            • י מנותק
                              י מנותק
                              יוסף בן שמעון
                              השיב לאהרן ב נערך לאחרונה על ידי
                              #15

                              @אהרן אמר באיך עובד זרמים ב-nodejs:

                              @dovid
                              אז מדוע בקוד הזה כל הדאטה נשלח בב"א?

                              app.get('/test', (req, res) => {
                                  res.write('OK1');
                                  setTimeout(()=>res.write('OK2'),1500);
                                  setTimeout(()=>res.end('OK END'),2500);
                              })
                              setTimeout(()=>{
                                  request({url: url}, function (error, response, body) {
                                      console.log(body);
                                  });
                              } ,2.5*1000);
                              

                              לא ברור לגמרי מה התכוונת בקוד הזה, אבל אם אני מבין נכון בפונקציה request אתה שולח לעצמך בקשה ומדפיס את התשובה לקונסול, אם כך זה ברור למה אתה רואה הכל מודפס בבת אחת, כי השתמשת ב callback במקום ב streaming, אז זה מחכה שכל התשובה תגיע ואחר כך קורא לפונקציה.
                              אם אתה רוצה לראות מימוש של streaming תכתוב כך

                              request(url).pipe(obj)
                              תגובה 1 תגובה אחרונה
                              1
                              • א מנותק
                                א מנותק
                                אהרן
                                השיב לdovid ב נערך לאחרונה על ידי
                                #16

                                @dovid אמר באיך עובד זרמים ב-nodejs:

                                בקשר לשאלה השניה, אנא קרא את תשובתי הראשונה באשכול.

                                תודה על המחמאה. באמת.

                                @dovid אמר באיך עובד זרמים ב-nodejs:

                                הכתיבה בראשון גוררת כתיבה בכולם

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

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

                                dovidD תגובה 1 תגובה אחרונה
                                0
                                • dovidD מנותק
                                  dovidD מנותק
                                  dovid ניהול
                                  השיב לאהרן ב נערך לאחרונה על ידי dovid
                                  #17

                                  @אהרן לא הבנתי מה המחמאה, או במידה וזה אירוני, ממה העלבון.
                                  כיון שאני משוכנע שאם היית קורא את מה שכתבתי ביתר אמון ורצון להבין היית כבר יודע יותר, אני מרשה לעצמי להיות מתוסכל ולהביע זאת.
                                  דחית מה שאמרתי בלי לקרוא ברצינות את תשובתי הראשונה (אולי זה היה מעליב ההפניה לשמה, אבל כתבתי את זה נטו בשביל לגרום לך לקרוא יותר) תוך היצמדות לניסוח (אדרבא, בא תסביר משהו שיבינו אותך בקלות בנושאים כאלו), גם מוסיפה לי מורת רוח. בשביל לחסוך גלילה אחורה:

                                  הStream של הקובץ מספק את המתודה pipe ושמה יש קוד פשוט שמקבל ארגומנט מסוג Stream אחר. והוא דואג על כל פיסת מידע שהוא מביא, לעשות write בזרם שהובא לו כפרמטר.

                                  אולי לא הייתי ברור במילים ש"הוא מביא" (לא ידעתי בכלל איך זה ממומש עם הevent כמו שהסביר @יוסף-בן-שמעון, כי אני מכיר את הרעיון של סטרים התיאורטי לא דוקא את מימושו בנוד), אבל ודאי שיש פה חומר קריאה ושהוא נכון. וודאי שמי שקורא בעיון את מה שכתוב פה לא יחשוב שהחומר (של הchunk הקודם) נשמר באיזה מקום.


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

                                  אתה טועה, כל הרעיון של סטרים הוא שאיננו שומר כלום בשום מקום, הוא נטו צינור.
                                  אפשר לתאר שרשור סטרימים ע"י סדרה של צינורות קטנים שמחברים אחד לשני, ובידוק לכן קוראים לזה pipe ולכן גם בחרו בלינוקס את תו הצינור בשביל הפעולה הזו.

                                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                  י תגובה 1 תגובה אחרונה
                                  0
                                  • י מנותק
                                    י מנותק
                                    יוסף בן שמעון
                                    השיב לdovid ב נערך לאחרונה על ידי יוסף בן שמעון
                                    #18

                                    @dovid אמר באיך עובד זרמים ב-nodejs:

                                    כל הרעיון של סטרים הוא שאיננו שומר כלום בשום מקום, הוא נטו צינור.

                                    אפשר לתאר שרשור סטרימים ע"י סדרה של צינורות קטנים שמחברים אחד לשני, ובידוק לכן קוראים לזה pipe ולכן גם בחרו בלינוקס את תו הצינור בשביל הפעולה הזו.

                                    המודל request מאפשר לקבל את המידע גם בסטרימינג וגם לקבל אותו מלא עם callback, זה אומר שאם אתה בוחר ב callback חוץ מהסטרימינג את גם טוען לזיכרון את כל המידע.
                                    כאן הוא בודק אם העבירו ארגומנט callback אז הוא כן טוען למערך את כל ה chunks

                                    תגובה 1 תגובה אחרונה
                                    1

                                    בא תתחבר לדף היומי!
                                    • התחברות

                                    • אין לך חשבון עדיין? הרשמה

                                    • התחברו או הירשמו כדי לחפש.
                                    • פוסט ראשון
                                      פוסט אחרון
                                    0
                                    • דף הבית
                                    • קטגוריות
                                    • פוסטים אחרונים
                                    • משתמשים
                                    • חיפוש
                                    • חוקי הפורום