<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ziba bahari</title>
        <link>https://virgool.io/feed/@ziba.bahari5</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-17 07:37:06</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/268407/avatar/YfHSPx.jpeg?height=120&amp;width=120</url>
            <title>ziba bahari</title>
            <link>https://virgool.io/@ziba.bahari5</link>
        </image>

                    <item>
                <title>(قسمت سوم)انتشار  و سابسکرایب در MQTT</title>
                <link>https://virgool.io/@ziba.bahari5/%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1-%D9%88-%D8%B3%D8%A7%D8%A8%D8%B3%DA%A9%D8%B1%D8%A7%DB%8C%D8%A8-%D8%AF%D8%B1-mqtt-mah0wiykdb6b</link>
                <description>در قسمت قبلی درمورد اینکه MQTT چطور کار می کند و topic ها در MQTT آشنا شدیم و همچنین در این قسمت با فرآیند انتشار و سابسکرایب در MQTT آشنا خواهیم شد و در آخر یک مثال عملی برای استفاده از بروکر Mosquitto و پیاده سازی کلاینت ها برای ارسال و دریافت پیام خواهیم داشت.در MQTT برای ارسال پیام(publishing)  و دریافت پیام از MQTT کلاینت باید در تاپیک موردنظر سابسکرایب کند. یک کلاینت می تواند در هر تاپیکی سابسکرایب کند مگر اینکه بروکر دسترسی آن را محدود کند.یک کلاینت بصورت مستقیم نمی تواند پیام را به کلاینت دیگری ارسال کند و اطلاعی از این ندارد که پیام توسط کلاینت دیگری دریافت شد یا نه.یک کلاینت پیام را نمی تواند به گروهی از تاپیک ها ارسال کند درصورتی که یک پیام می تواند توسط چندین کلاینت دریافت شود. QOS روی پیام های منتشر شدهسه سطح از QOS توسط MQTT پشتیبانی می شودQOS -0 –حالت پیش فرض هست و تضمینی در ارسال پیام وجود نداردQOS -1 –تضمین تحویل پیام را دارد ولی شاید تکراری باشدQOS -2 -تضمین تحویل پیام بدون تکرارپیامی که منتشر می شود از یکی از این سه سطوح استفاده می کند و حالت پیش فرض آن QOS -0 است.اگر شما می خواهید اطمینان حاصل کنید که سابسکرایبر حتما پیام را دریافت کرده است باید مقدار 1 یا 2 را قرار دهید.درصورت تنظیم 1 یا 2 برای QOS سرور یک پیام تصدیق را برمی گرداند. این کار منجر به ارسال چندین پیام بین کلاینت ها و سرور می شود. پیام های منتشر شده با QOS 0 فقط به یک پیام نیاز دارند و توسط سرور تأیید نمی شوند. پیام های منتشر شده با QOS 1 یا 2 همچنین دارای یک شماره شناسه پیام(MID) هستند که می تواند برای ردیابی پیام استفاده شود.انتشار پیام و فلگ Retainوقتی یک کلاینت اقدام به ارسال پیام به بروکر می کند تاپیک پیاممقدار QOSRetain Flag : آیا پیام باید حفظ شود که با مقدار Retain Flag تعیین می شودمقدار Retain Flag بصورت پیش فرض False هست به این معنی که بروکر پیام را نگه نمی دارد.مقدار QOS روی نگهداری پیام تاثیری ندارد.کاربرد اصلی این مورد برای حسگرهایی است که تغییر زیادی نمی کنند و  وضعیت خود را به ندرت منتشر می کنند.به عنوان مثال ، اگر سنسور درب داشته باشید ، انتشار وضعیت آن در هر ثانیه وقتی تقریباً همیشه وضعیت یکسان باشد ، چندان منطقی نیست.بعد از منتشر کردن پیام چه اتفاقی می افتد؟1. پس از دریافت پیام توسط کلاینت، چه اتفاقی می افتد؟2. در صورت نبودن سابسکرایبر، چه اتفاقی برای پیام منتشر شده می افتد؟برای پاسخ به این سوالات پخش تلویزیون یا رادیو را در نظر بگیریداگر در پخش یک برنامه ملحق نشوید ، به راحتی آن را از دست می دهید!بنابراین برای سوال 1 و سوال 2 پاسخ این است - پیام از بروکر حذف می شود.وقتی کلاینت پیامی را بر روی یک تاپیک منتشر می کند، بروکر آن پیام را به کلاینت هایی که بر روی آن تاپیک سابسکرایب کرده اند، توزیع می کند. پس از ارسال پیام به آن کلاینت، پیام از بروکر حذف می شود.اگر هیچ مشترکی در این تاپیک سابسکرایب  نشده باشد یا در حال حاضر به اینترنت متصل نباشد ، پیام از بروکر حذف می شود. به طور کلی بروکر پیام ها را ذخیره نمی کند.توجه: پیامهای حفظ شده ، ارتباطات مداوم و مقدار QOS می تواند باعث شود که پیامها به طور موقت در بروکر/ سرور ذخیره شوند.سابسکرایببرای دریافت پیام در مورد یک موضوع باید مشترک(subscriber) تاپیک یا تاپیک هایی شوید.هنگام سابسکرایب شدن در یک تاپیک، باید QOS تاپیک را نیز تنظیم کنید.هنگامی که در یک تاپیک یا چندین تاپیک سابسکرایب می شوید ، به طور موثر به بروکر می گویید که پیام های آن تاپیک را  برای شما ارسال کند.برای ارسال پیام به مشترک ، بروکر از همان مکانیسم انتشار استفاده می کند که توسط کلاینت برای انتشار پیام روی بروکر استفاده می شود.منبع: http://www.steves-internet-guide.com/</description>
                <category>ziba bahari</category>
                <author>ziba bahari</author>
                <pubDate>Thu, 22 Apr 2021 13:59:54 +0430</pubDate>
            </item>
                    <item>
                <title>(قسمت دوم) تاپیک ها در MQTT</title>
                <link>https://virgool.io/@ziba.bahari5/%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%AA%D8%A7%D9%BE%DB%8C%DA%A9-%D9%87%D8%A7-%D8%AF%D8%B1-mqtt-slplvzabd4fs</link>
                <description>در قسمت قبلی درمورد  اینکه MQTT چطور کار می کند صحبت کردیم و در این قسمت  با topic ها در MQTT آشنا خواهیم شد و همچنین در قسمت بعدی با فرآیند انتشار و سابسکرایب در MQTT آشنا خواهیم شد و در آخر یک مثال عملی برای استفاده از بروکر Mosquitto و پیاده سازی کلاینت ها برای ارسال و دریافت پیام خواهیم داشت.تاپیک ها در MQTT یک فرم آدرس دهی هستند که اجازه اشتراک اطلاعات را به کلاینت ها می دهد.ساختار تاپیک ها مثل ساختار آدرس دهی فولدرها بصورت سلسه مراتبی با استفاده از اسلش(/) هست. با استفاده از این سیستم می توانید ساختارهای نامگذاری کاربر پسندی داشته باشید.اسامی تاپیک:به بزرگ کوچک بودن حروف حساس هستندباید از UTF-8 استفاده کردحداقل باید یک کاراکتر داشته باشدبه جز SYS topic$ هیچ تاپیکی با ساختار استاندارد و بصورت پیش فرض وجود ندارد و تنها تاپیکی هست که توسط بروکر ایجاد شده است.بقیه تاپیک ها توسط کلاینت های انتشار دهنده و گیرنده پیام ها ایجاد می شوند و دایمی نیستند. یک تاپیک زمانی وجود دارد که یک کلاینت در آن سابسکرایب کند و یا بروکر دارای مقدار  retained باشد و یا last will messages برای تاپیک ذخیره شده باشد.$SYS topicیک تاپیک رزرو شده است که اغلب بروکرها برای انتشار اطلاعات بروکرها استفاده می کنند. نمونه ای از تاپیک SYS$ در تصویر زیر مشاهده می کنید.اشتراک (Subscribing) در تاپیک هایک کلاینت می تواند در یک یا چندین تاپیک سابسکرایب کند. وقتی سابسکرایب در جندین تاپیک صورت گیرد دو علامت می تواند استفاده شود1) #/ کاراکتر هش/ برای چندین کاراکتر2) +/ کاراکتر پلاس/ برای یک کاراکترWildcards  برای نمایش یک یا چندین سطح بکار می رود مانند #/house/و نمی تواند به عنوان بخشی  از یک نام باشد مثل #houنمونه ای از Wildcards های مناسب سابسکرایب روی تاپیک #/house موارد زیر را ساپورت می کندhouse/room1/main-lighthouse/room1/alarmhouse/garage/main-lighthouse/main-dooretcسابسکرایب روی house/+/main-lighthouse/room1/main-lighthouse/room2/main-lighthouse/garage/main-lightولی موارد زیر را ساپورت نمی کند house/room1/side-lighthouse/room2/side-lightنمونه ای از تاپیک های INVALIDhouse+ – Reason- no topic levelhouse# – Reason- no topic levelانتشار روی یک تاپیکیک کلاینت فقط روی یک تاپیک می تواند پابلیش کند و از Wildcards ها نمی تواند استفاده کند.  یعنی اگر یک کلاینت بخواهد روی دو تاپیک پابلیش انجام دهد باید دوبار یک پیام را ارسال کند.چه زمانی یک تاپیک ایجاد می شوداگر یک کلاینت روی یک تاپیک سابسکرایب انجام دهدکلاینتی یک پیام را روی یک تاپیک پابلیش کند و مقدار retained را برابر TRUE قرار دهد.چه زمانی تاپیک ها از روی بروکر حذف می شوندوقتی که آخرین کلاینتی که روی تاپیک سابسکرایب کرده ارتباطش با بروکر قطع شود یا وقتی کلاینتی با مقدار TRUE برای clean session تنظیم شود.منبع: http://www.steves-internet-guide.com/</description>
                <category>ziba bahari</category>
                <author>ziba bahari</author>
                <pubDate>Thu, 22 Apr 2021 13:54:11 +0430</pubDate>
            </item>
                    <item>
                <title>(قسمت اول) MQTTچیست؟</title>
                <link>https://virgool.io/@ziba.bahari5/httpsvirgooliozibabahari5mqtt%DA%86%DB%8C%D8%B3%D8%AA-nlmvfmvtimkm</link>
                <description>MQTT در سال 1999 توسط مهندسان  Andy Stanford-Clark و Arlen Nipper ابداع شد ، به عنوان روشی  برای برقراری ارتباط خطوط لوله در صنعت نفت و گاز با سیستم های نظارت و دستیابی به داده ها (SCADA).هدف داشتن پروتكل کارآمد برای پهناي باند ، سبك و مصرف کم باتری بود ، زيرا دستگاه ها از طريق اتصالات ماهواره اي متصل بودند كه در آن زمان بسيار گران بود. این سیستم ها از پروتکل های انحصاری و متفاوت استفاده می کردند و به همین ترتیب قادر به برقراری ارتباط با یکدیگر نبودند. افزودن یکسری قابلیت ها به MQTT به برقراری ارتباط بین دستگاه ها کمک می کند.MQTT یک پروتکل M2M یا machine to machine است. ارتباط این پروتکل بر اساس ارتباطات کلاینت سروری می باشد و همچنین در لایه شبکه یا Network قرار دارد. MQTT پروتکلی است که بر روی پروتکل TCP کار می کند و برای شبکه هایی که بر روی TCP کار می کند مناسب می باشد.ورژن دیگری از MQTT وجود دارد که برای شبکه های UDP مناسب است.در این قسمت به درک درستی از اینکه MQTT چطور کار می کند می رسیم و در قسمت های بعدی با topic ها در MQTT و همچنین فرآیند انتشار  و سابسکرایب در MQTT آشنا خواهیم شد و در آخر یک مثال عملی برای استفاده از بروکر Mosquitto  و پیاده سازی کلاینت ها برای ارسال و دریافت پیام خواهیم داشت.چرا از MQTT  استفاده می کنیم؟سبک و کارآمدکلاینت های MQTT بسیار کوچک هستند ، به حداقل منابع نیاز دارند تا بتوان از آنها در میکروکنترلرهای کوچک استفاده کرد. هدرهای پیام MQTT برای بهینه سازی پهنای باند شبکه کوچک هستند. ارتباطات دو طرفه MQTT امکان پیام رسانی بین دستگاه به cloud و cloud به دستگاه را فراهم می کند. این امر باعث می شود پیام ها به راحتی بین گروهی از کلاینت ها توزیع شود. مقیاس بزرگ MQTT می تواند برای ارتباط با میلیون ها دستگاه اینترنت اشیا استفاده شود. اطمینان در تحویل پیام  قابلیت اطمینان در ارسال پیام برای بسیاری از یوزکیس های اینترنت اشیا مهم است. به همین دلیل است که MQTT دارای 3 سطح کیفیت خدمات تعریف شده است: 0 - حداکثر یک بار ، 1- حداقل یک بار ، 2 - دقیقاً یک بار پشتیبانی از شبکه های غیر قابل اعتماد بسیاری از دستگاه های اینترنت اشیا از طریق شبکه های تلفن همراه غیر قابل اطمینان متصل می شوند. پشتیبانی MQTT از ارتباط مداوم زمان اتصال مجدد مشتری با بروکر را کاهش می دهد. امنیت MQTT از رمزگذاری پیام با استفاده از TLS و احراز هویت سرویس گیرنده با استفاده از پروتکل های مدرن احراز هویت ، مانند OAuth استفاده می کند.MQTT چطور کار می کند؟ MQTT یک پروتکل ارسال پیام است که برای فرستادن پیام بکار می رود و از مدل publish/subscribe استفاده می کند این مدل امکان ارسال پیام به یک یا چندین کلاینت را فراهم می سازد. برای مثال در تلویزیون، پخش کننده تلویزیونی با استفاده از یک کانال خاص یک برنامه تلویزیونی را پخش می کند و بیننده برای دیدن برنامه به این کانال ملحق می شود. در اینجا ارتباط مستقیمی بین پخش کننده و بیننده وجود ندارد.در MQTT انتشاردهنده پیام(publisher) یک پیام را روی یک موضوع(topic ) منتشر می کند و دریافت کننده پیام (subscriber) با اشتراک در آن تاپیک می تواند پیام را دریافت کند. MQTT به یک بروکر مرکزی همانطور که در شکل زیر نشان داده شده نیاز دارد. publish/subscribe  مدلکلاینت ها مثل سیستم ایمیل آدرس ندارند و پیام ها به کلاینت ارسال نمی شوند.پیام ها روی یک تاپیک در بروکر منتشر می شوند.وظیفه بروکر فیلتر پیام ها بر اساس تاپیک و توزیع آنها به سابسکرایبرها است.یک کلاینت پس از سابسکرایب در یک تاپیک روی یک بروکر مشترک٬ می تواند پیام را دریافت کند.هیچ ارتباط مستقیمی بین انتشاردهنده پیام(publisher) و دریافت کننده پیام (subscriber) وجود ندارد.همه کلاینت ها می تواند عملیات انتشار(publishe) و اشتراک(subscriber) را انجام دهند.بروکرها معمولا پیام ها را ذخیره نمی کنند.ارتباط کلاینت-بروکر در MQTTبرای برقراری ارتباط در MQTT از TCP/IP استفاده می شود. TCP گارانتی می کند که بسته ها به ترتیب دریافت شوند. ارتباط TCP/IP مانند ارتباط تلفن هست. وقتی ارتباط تلفن برقرار شد شما می توانید حرف بزنید تا اینکه یکی از طرفین قطع شود. اغلب کلاینت های MQTT به بروکر وصل می شوند تا وقتی که آنها نخواهند پیامی ارسال کنند.هیچ انتشار و اشتراک پیامی انجام نمی شود مگر اینکه ارتباط برقرار شود.keepaliveبرای برقراری ارتباط در MQTT از TCP/IP استفاده می شود که یک ارتباط یک طرفه باز است که کلاینت در هر زمانی می تواند پیام ارسال یا دریافت کند ولی اگر در طول یک زمان مشخصی هیچ پیامی دریافت نشود کلاینت یک PINGREQ ایجاد میکند و انتظار یک PINGRESP از بروکر دارد. این تبادل پیغام تصدیق می کند که ارتباط همچنان برقرار است به این طول زمان مشخص شده keep alive period گفته می شود.کلاینت ها یک پیام keepalive در هر 60 ثانیه به بروکر ارسال می کنند که اطلاع دهند هنوز ارتباط برقرار است. در حقیقت Keep Alive یه بازه زمانی هست که به ثانیه تعریف می شود و با 16بیت توصیف می شود.حالت پیش فرض 60ثانیه هست ولی هر تایمی می توان تنظیم کرد.connect(host, port=1883, keepalive=60, bind_address=””)Client Name or Client IDهمه کلاینت ها باید client name یا ID داشته باشند. client name توسط بروکر برای شناسایی سابسکرایب ها بکار می رود. client name باید یکتا باشد. اگر شما سعی کنید با یک client name تکراری به بروکر وصل شوید ارتباط کلاینت قبلی که با این نام وصل شده٬ قطع می شود.حال به دلیل اینکه کلاینت هایی که قطع می شوند سعی در اتصال مجدد دارند و این حلقه قطع و وصل ادامه می یابدClean Sessionsکلاینت ها ارتباط Clean Sessions را با بروکر برقرار می کنند. در Clean Sessions وقتی یک کلاینت قطع می شود٬ بروکر هیچ اطلاعاتی را نگهداری نمی کند. در یک ارتباط non clean session بروکر سابسکرایب های انجام شده توسط کلاینت و پیام هایی که به کلاینت تحویل داده نشده است را نگهداری می کند.البته این بستگی به مقدار  Quality of service دارد وقتی اشتراک یا انتشاری بر روی یک تاپیک انجام می شود٬ تنظیم می شود٬ که در بخش بعدی در این مورد بحث خواهیم کرد.Last Will Messagesایده Last Will Messages این است که به مشترک اطلاع داده شود که انتشار دهنده پیام در شبکه در دسترس نیست. Last Will Messages توسط کلاینت انتشاردهنده پیام تنظیم می شود و هر تاپیک می تواند مقدار خودش را داشته باشد. این پیام در بروکر ذخیره می شود و اگر ارتباط با انتشاردهنده پیام ناموفق باشد این پیغام به مشترک ها ارسال می شود.منبع: http://www.steves-internet-guide.com/mqtt-works/ </description>
                <category>ziba bahari</category>
                <author>ziba bahari</author>
                <pubDate>Thu, 22 Apr 2021 13:48:26 +0430</pubDate>
            </item>
                    <item>
                <title>NodeJS چیست؟</title>
                <link>https://virgool.io/CodeLovers/nodejs-%DA%86%DB%8C%D8%B3%D8%AA-msh3wjbotjzz</link>
                <description>برای اجرای جاوااسکریپت در مرورگر نیاز به یک موتور جاوااسکریپت هست تا کد جاوااسکریپت را به یک کد قابل فهم برای کامپیوتر تبدیل کند، برای مثال برای اجرای جاوااسکریپت در مرورگر Microsoft edge از موتور Chakra  در فایرفاکس از Spider Monkey و در مرورگر کروم از موتور V8 استفاده می کند، تا قبل از  2009 جاوااسکریپت فقط در مرورگر اجرا می شد در سال 2009  Ryan Dahl نود را معرفی کرد که ایده درخشانی برای اجرای  جاوااسکریپت را در خارج از مرورگر است.NodeJS چگونه کار می کند؟برای اجرای یک پروژه NodeJS کد جاوااسکریپت می نویسیم و این کد را با node اجرا می کنیم. حالا می خواهیم درمورد نحوه کار NodeJS بیشتر بدانیم.Nodejs برای اجرا از موتورV8 و کتابخانه libuv استفاده می کند، V8 یک موتور متن باز هست که توسط گوگل ایجاد شده است، بر همین اساس می توانیم کد جاوااسکریپت را خارج از مرورگر و در ترمینال اجرا کنیم.Libuv یک پروژه متن باز C++ است که به Node اجازه دسترسی به سیستم عامل و فایل های سیستمی را می دهد.چرا از Node استفاده می کنیم، چرا به طور مستقیم از V8 و libuv استفاده نمی کنیم؟V8 و libuv  براساس کد جاوااسکریپت پیاده سازی نشده اند، طبیعتا یک برنامه نویس جاوااسکریپت هم نمی خواهد با کد C++ درگیر شود، Node  یک اینترفیس خوب در اختیار برنامه نویس ها قرار می دهد تا فقط کد جاوااسکریپت خود را بنویسند و آن به راحتی توسط Node اجرا شود. Node از دو بخش جاوااسکریپت و C++ تشکیل شده است.میزان استفاده از کد جاوااسکریپت و C++ در هر قسمت در شکل پایین مشخص شده است.کار دیگری که Node انجام می دهد یکسری wrapper و API های سازگاری را فراهم می آورد تا در پروژه استفاده کنیم. Node یکسری ماژول های استانداردی مثل http crypto,  و path دارد که اینها بصورت توابع در libuv تعریف شده اند.چطور توابع و ماژول ها در Node تعریف می شوند؟اگر به سورس کد Node نگاه کنیم یک فولدرlib وجود دارد که تمام توابع و ماژول های جاوااسکریپتی که در پروژه ها استفاده می کنیم در این فایل قرار دارند و در فولدر src پیاده سازی سمت C++ از این توابع قرار دارد.برای درک بهتر چگونگی ارتباط و اجرای نود باید بدانیم که Node شامل دو بخش است یک سمت جاوااسکریپت Node است و سمت دیگر بخش C++ هست که برای اتصال جاوااسکریپت به C++ از binding(Name of function)  استفاده می شود و توسط V8 مقادیر جاوااسکریپت به C++ ترجمه می شوند، مثل تعریف آبجکت ها و آرایه ها و boolean.Event loop چیست و چگونه کار می کند؟برای مدیریت کردن کدهای ناهمگام (Async)  در Node از event loop استفاده می شود.وقتی یک برنامه ای را در کامپیوتر اجرا می کنیم یک فرآیند(process) را شروع می کنیم، فرآیند یک موجودیت از یک برنامه کامپیوتری است . Threadها واحدهای عملیاتی هستند در حقیقت یک thread  لیستی از تعدادی عملیات است که باید در cpu اجرا شود یک thread به cpu داده می شود و باید همه عملیات ها از بالا به پایین اجرا شوند. یک فرآیند می تواند چندین thread  داشته باشد.scheduling توانایی تصمیم گیری در مورد این است که کدام فرآیند در هر زمان اجرا شود. Scheduling  توسط سیستم عامل کنترل می شود، کامپیوتر تعداد محدودی منابع دارد و cpu می تواند عملیات زیادی را در هر ثانیه انجام دهد هدف این است که threadها درگیر یک عملیات نمانند برای بهبود استفاده از thread ها دو راهکار وجود دارد.میتوانیم cpu coreهای بیشتری را اضافه کنیم در این صورت چندین thread در یک زمان واحد می توانیم اجرا کنیم.روش دوم اینکه زمان هایی که یک thread متوقف می شود شناسایی شود و در آن زمان thread  آزاد شود و عملیات دیگری را اجرا کند.Node یک thread ایجاد می کند و همه کدها را داخل یک thread اجرا می کند. داخل یک single thread یک event loop قرار دارد.event loop مثل یک ساختار کنترلی هست که تصمیم می گیرد کدام عملیات اجرا شود، event loop یک core از هر برنامه ای هست که در حال اجرا هست، می توانیم بگوییم event loop  مثل یه حلقه while عمل می کند که برای ادامه اجرا یا اتمام فرآیند یکسری شرایط را بررسی می کند.Function shouldContinue(){Check #1 : any setTimeout, setIntervalCheck #2: any pending os task such as httpRequestCheck #3: any pending long running operation like fs module}While(shouldcontinue()){}Check #1: اگر کد ناهمگام مثل setTimeout, setInterval وجود داشته باشد event loop در حال اجرا باقی می ماند تا پس از زمان مشخص شده callback مخصوص به آن صدا زده شود.Check #2: یکسری از ماژول ها مثل ایجاد و دریافت درخواست های http و یا دریافت فایل ها جزو این دسته قرار می گیرند.Check#3: در event loop چک می شود که توابعی در داخل thread poolها در حال اجرا هستند یا نه.آیا نود single thread است؟Event loop در نود بصورت کامل single thread است. وقتی ما یک برنامه را اجرا می کنیم یک single thread از event loop ایجاد می شود. در اینجا این سوال مطرح می شود اگر سیستم ما چندین cpu داشته باشد NodeJS نمی تواند از آنها استفاده کند در نتیجه برنامه خیلی سریع اجرا نمی شود؟برای پاسخ به این سوال باید گفت که برخی از توابع و کتابخانه های Node در داخل thread pool اجرا می شوند و برخی دیگر از توابع برای اجرا از ویژگی های async os استفاده می کنند، این توابع single thread نیستند.برخی کتابخانه ها و فریم ورک هایی که در Node قرار دارند در حقیقت single thread نیستند برای مثال الگوریتم رمزگذاری داده PBKDF2 را در نظر بگیرید که داخل کتابخانه crypto هست، در این الگوریتم بیشتر کارها در سمت C++ از Node انجام می شود،  Node در سمت  C++ و libuv تصمیم می گیرند که محاسبات بصورت کامل در خارج از event loop انجام شوند که برای اجرا یک thread pool  را صدا می زنند این thread pool  بصورت پیش فرض از چهار thread تشکیل شده اند که می توانند برای اجرای کارهای محاسباتی مثل PBKDF2 استفاده شوند.  برای مثال اگر ما پنج تسک داشته باشیم و thread pool دارای چهار thread باشد در این صورت چهار تسک بصورت همزمان اجرا می شوند و تسک آخر با کمی تاخیر. بسیاری از توابع استاندارد از این thread pool  استفاده می کنند در نتیجه Node برای محاسبات single thread نیست.برای تغییر تعداد thread های thread pool  می توان مقدار تعیین شده در env را تغییر داد.Process.env.UV_THREADPOOL_SIZE = 2اینکه چه توابعی در nodejs از thread pool استفاده می کنند بستگی به سیستم عامل ما دارد ولی اصولا در همه سیستم عامل های توابع fs و  crypto از thread pool استفاده می کنند.در حقیقت تسک هایی که در thread pool در حال اجرا هستند جزو check#3 در event loop قرار می گیرند و در صورتی که اجرای تسک مربوطه تمام شود callback مربوط به آن صدا می شود.پس همانطور که گفته شد یکسری از توابع و کتابخانه های Node در داخل thread pool اجرا می شوند ولی یکسری ازتوابع دیگر از ویژگی های async os استفاده می کنند، این توابع نماینده هایی برای سیستم عامل هستند و بصورت کامل در خارج از event loop  اجرا می شوند، مثل درخواست های http همه کارها توسط خود سیستم عامل انجام می شود و  برای اجرای این توابع thread pool  وجود ندارد، بعنوان مثال برای ایجاد یک درخواست http کتابخانه libuv یک نماینده برای ارسال درخواست به سیستم عامل هست و پس از آن منتظر دریافت سیگنال از سیستم عامل می ماند در این صورت هیچ بلاکی در کد جاوااسکریپت ما صورت نمی گیرد و خود سیستم عامل تصمیم می گیرد که یک thread جدید ایجاد کند یا نه.بنابراین تسک هایی که از ویژگی های async os استفاده می کنند جزو شرایط check#2 در event loop قرار می گیرند و تازمانی که یک درخواست درحال اجرا باشد حلقه داخل event loop  در حال اجرا باقی می ماند.پس از اتمام اجرا وقتی همه شرایط بررسی می شوند و callbackهای مربوطه صدا زده می شوند، عملیات داخل event loop به پایان می رسد کدهای clean up  اجرا می شود تا یکسری  running server ها و فایل های باز را ببندد.[1] Stephen Grider. Udemy – Node JS: Advanced Concepts 2020-3.</description>
                <category>ziba bahari</category>
                <author>ziba bahari</author>
                <pubDate>Mon, 01 Feb 2021 13:28:48 +0330</pubDate>
            </item>
            </channel>
</rss>