<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی سفیدموی</title>
        <link>https://virgool.io/feed/@ali-sefidmouy</link>
        <description>توسعه دهنده نرم افزار، مشتاق یادگیری و ماجراجو ;)</description>
        <language>fa</language>
        <pubDate>2026-04-15 05:23:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/30711/avatar/VF87qf.png?height=120&amp;width=120</url>
            <title>علی سفیدموی</title>
            <link>https://virgool.io/@ali-sefidmouy</link>
        </image>

                    <item>
                <title>همیشه از مدل ارتباطی sync استفاده نکنید!</title>
                <link>https://virgool.io/@ali-sefidmouy/sync-async-alternatives-xl4ygmj4iezm</link>
                <description>سلام به همگی :)خب بعد از مدت ها تصمیم گرفتم با یک موضوع جذاب، به نوشتن ادامه بدم. راستش دلم برای حسِ خوبِ نوشتن براتون، تنگ شده بود و فرصتی هم پیدا شد که بنویسم :)تا حالا شده بازی تلفن رو انجام بدید؟ حتما در جمع خانواده و دوستان این بازی رو قبلا انجام دادید. بازی تلفن به این صورته که یک نفر یک جمله رو پیش خودش میسازه و به طوری که بقیه متوجه محتوای جمله نشن، اون رو در گوش نفر کناری اعلام میکنه. این فرایند تا جایی ادامه پیدا میکنه که به نفر آخر برسه و اون جمله رو بلند اعلام کنه. با فرض این که محتوای جمله، به طور صحیح به نفر آخر رسیده باشه، همه افراد، منتظر نفر و یا نفرات قبل قبل برای دریافت جمله (پیام) هستن و به نحوی معطل (بلاک) میشن.ارتباط همگام (Synchronous communication)، به ارتباطی گفته می شود که یک سرویس قبل از اقدام، منتظر پاسخ سرویس دیگر می ماند.در حالی که این مدل ارتباطی گاهی اوقات به خوبی کار می کنه، اما تکیه همیشگی بر ارتباط همگام برای هر نوع تعامل بین میکروسرویس ها انتخاب مناسبی نیست. چرا؟ بیاین در موردش یکم جدی تر و البته فنی تر صحبت کنیم.چالش های ارتباط همگاماگر فقط از ارتباط همگام استفاده کنیم، با رشد مقیاس پروژه و یا محصول در حال توسعه، دچار یک سری چالش خواهیم شد:چالش های ارتباط Synchronous تاخیرِ فزایندههمانطور که گفتیم، در یک مدل همگام، یک سرویس درخواستی را به سرویس دیگر می فرستد و منتظر پاسخ می ماند. اگر چندین سرویس با این روش به هم متصل بشوند، با تاخیر زیادی مواجه خواهیم شد.به عنوان نمونه، اگر سرویس A سرویس B را فراخوانی کند، که خودِ B ، سرویس C را فراخوانی می کند، زمان پاسخ نهایی برابر با مجموع زمان های تاخیر هر فراخوانی خواهد شد. در سناریوهایی که سرویس ها از نظر جغرافیایی توزیع شده یا تحت بار سنگین هستند، این تاخیر به یک bottleneck تبدیل می شود.ایجاد downtime و خرابی های سلسله وارزمانی که یک سرویس به طور همگام به سرویس دیگر وابسته است، هرگونه downtime یا خرابی در یک سرویس می تواند کل سیستم را در بر بگیرد.اگر سرویس B در دسترس نباشد، سرویس A نمی تواند درخواست های خود را پردازش کند. اینجا اصطلاحاً به دلیل tight coupling که بین دو سرویس وجود دارد، عملکرد کل سیستم را شکننده می کند. به بیان دیگر یک نوع وابستگی ضمنی در اینجا به وجود آمده است که در آن برای این که کل سیستم دچار اختلال نشود باید هر دو سرویس A و B عملیاتی و در حال پاسخ دهی در لحظه باشند.هزینه بیشترارتباط همگام، برای پاسخ دهی real-time به درخواست ها نیازمند نگهداری و مراقبت است.برای پاسخگویی در زمان های پیکِ درخواست، باید منابع سخت افزاری بیشتری تامین کنیم، که منجر به استفاده غیر بهینه از منابع، در طول زمان های خارج از پیک می شود. البته به طور خاص برای این چالش راه حل هایی مانند Autoscaling ارائه شده است که نمونه هایی از آن در Autoscaling در کوبرنتیز و یا AutoScalingGroup در OpenStack به کار گرفته شده است.جایگزین هایی برای ارتباط همگامروش های گوناگونی برای مدل ارتباطی Synchronous وجود دارد که در ادامه به معرفی بعضی از آن ها می پردازیم : مدل Asynchronous Request-Responseدر مدل ارتباط غیرهمگام، بر خلاف مدل همگام، فراخواننده سرویس، درخواست را ارسال می کند اما با این که منتظر پاسخ است، بلاک نمی شود. به عنوان مثال، یک میکروسرویس Payment می تواند درخواست &quot;Process Payment&quot; را در یک صف قرار دهد. میکروسرویس &quot;Billing&quot; درخواست را به صورت غیرهمگام پردازش می کند و یک پیام &quot;Payment Processed&quot; را در response queue قرار می دهد.یک الگوی رایج برای پیاده سازی این روش، استفاده از message queue (صف پیام)، مانند Kafka و یا RabbitMQ است.Asynchronous Request-Responseنحوه عملکرد:سرویس sender ، یک request را در صفِ پیام قرار می دهد.سرویس receiver ، درخواست را به صورت غیرهمگام پردازش کرده و response را در صف قرار میدهد.سرویس sender ، به راحتی response را برمیدارد.مزایا:به دلیل فرآیند non-blocking ، پاسخگویی بهتر می شود. نیازی به عملیاتی بودن سرویس ها به صورت در لحظه و همزمان نیست، چرا که سرویس ها اصطلاحاً loosely couple بوده و از یکدیگر مستقل اند.صف پیام مانند بافر عمل کرده که هنگام ترافیک شدید، کمک کننده خواهد بود.مدل Event-Driven Architectureدر یک معماری Event-Driven، سرویس ها به وسیله publish/subscribe کردن به event ها ارتباط برقرار می کنند. به جای فراخوانی مستقیم سرویس ها به یکدیگر، سرویس ها event هایی را منتشر (publish) می کنند که سرویس های دیگر آن ها را مصرف می کنند.به عنوان مثال، زمانی که یک رخداد &quot;OrderPlaced&quot; به وسیله سرویس ثبت سفارش منتشر می شود، سرویس انبارداری موجودی خود را آپدیت میکند و همچنین سرویس Notification یک ایمیل تایید سفارش ارسال می کند. این عملیات ها بدون ارتباط مستقیم سرویس ها با یکدیگر انجام می شود.Event-Driven Architectureنحوه عملکرد:سرویس ها event ها (مانند &quot;OrderPlaced&quot; یا &quot;PaymentProcessed&quot;) را به سمت یک message broker مانند Kafka ، منتشر می کنند.سرویس های مرتبط با event منتشر شده به آن event ها اصطلاحاً subscribe میکنند و عملیات مربوطه را انجام می دهند.مزایا:استقلال سرویس ها از یکدیگر به دلیل این که سرویس ها در لحظه نیازی به در دسترس بودن یکدیگر ندارند، تاب آوری (resiliency) و مقیاس پذیری (scalability) بالاتری فراهم می شود.در این حالت، اضافه کردن فانکشنالیتی جدید ساده تر خواهد بود. در واقع بدون این که publisher را تغییر بدهیم، میتوانیم سرویس های جدیدی ایجاد کنیم که به راحتی به event های موجود subscribe کنند.ایجاد حد و مرز خوش-تعریف برای سرویس هازمانی که سرویس ها با استفاده از اصل مهم Single Responsibility و همچنین با حد و مرز مشخص و بدون overlap اضافی تعریف و پیاده سازی شوند، به طور طبیعی نیاز به ارتباط بین سرویس ها کاهش پیدا می کند. فرض کنید یک سرویس User داخل برنامه تعریف شده است که همزمان به احراز هویت و داده کاربرها رسیدگی می کند. در اینجا بهتر است سرویس User به دو سرویس UserProfile و Authentication تقسیم شود. این کار باعث کاهش تعامل های اضافی شده و همینطور سبب افزایش قابلیت نگهداری و مقیاس پذیری هر کدام از این سرویس ها می شود. Well-Defined Service Boundariesمدل Bulk Data Transferبرای سناریوهایی که نیازمند جابه جایی حجم زیادی از دیتا هستند، به جای استفاده از درخواست های synchronous، باید از bulk data transfer استفاده کنیم. به عنوان مثال، برای یک سرویس که وظیفه Reporting را بر عهده دارد و لاگ های تراکنش پرداخت را از سرویس Payment میگیرد، به جای آن که برای دریافت report ، به هر تراکنش کوئری بزند، از این مکانیزم استفاده می کند.Bulk Data Transferنحوه عملکرد:سرویس ها به صورت دوره ای از طریق batch job و یا data replication داده ها را بین یکدیگر منتقل میکنند.این عملیات ها به صورت asynchronously و خارج از زمان پیکِ ترافیکی انجام می شود.مزایا:کاهش بار سرویس ها هنگام انجام دیگر عملیات های real timeبهبود بهره وری کلی سیستممدل Local Copy Caching اغلب اوقات، فراخوانی های مکرر بین سرویس ها می تواند با مکانیزم caching و یا نگهداری کپی محلی، جایگزین شود. برای مثال سرویس Product به جای این که هر بار جزئیات محصول را از سرویس Catalog فراخوانی کند، میتواند جزئیات محصولات پر بازدید را cache کند.Caching Local Copyنحوه عملکرد:استفاده از راهکارهای caching مانند Redis یا Memcached برای داده هایی که فراخوانی بیشتری دارندمکانیزمی برای انتقال state بین سرویس ها ایجاد می شود تا از فراخوانی های مکرر جلوگیری شود. همچنین اگر داده اصلی تغییر پیدا کرد کپی محلی قبلی معتبر نبوده و کافیست با فراخوانی داده جدید، کپی محلی به روز رسانی شود.مزایا:کاهش تاخیر دسترسی به داده به دلیل نگهداری کپی محلیهنگامی که  به طور مثال سرویس Catalog از دسترس خارج شود، کپی محلی که در سرویس Product کَش شده است می تواند بازگردانده شود و مدت کوتاهی برای بازیابی سرویس Catalog زمان بخرد.سخن پایانی - نکات مهم برای به کارگیری راهکارهای معرفی شده :دقت در استفاده و در نظر گرفتن شرایط :  در همه سناریوها ارتباط async معنی ندارد. چنان که در همه سناریوها ارتباط sync معنی پیدا نمی کند. با تحلیل trade-off ها روشی که با نیازمندی های شما همخوانی دارد را استفاده کنید.مانیتورینگ و دیباگ : از ابزارهای distributed tracing مانند Jaeger یا Zipkin برای مانیتور کردن جریان های async و عیب یابی مشکلات استفاده کنید.تنزل دادن سرویس ها به آرامی : هنگام رخداد خرابی در سیستم، مکانیزم های fallback و retry را به صورت graceful و به آرامی اجرا کنید.در نظر گرفتن Idempotency : مطمئن شوید که عملیات های مورد نظر شما به صورت Idempotent اجرا می شوند و با پیام های duplicate به صورت صحیح برخورد می شود تا یک عملیات که تنها یک بار لازم است اجرا شود، دو بار و بیشتر اجرا نشود.این هم از مطلب امروز در مورد راهکارهای مختلف ارتباطی بین میکروسرویس ها!امیدوارم براتون مفید بوده باشه😇</description>
                <category>علی سفیدموی</category>
                <author>علی سفیدموی</author>
                <pubDate>Tue, 31 Dec 2024 23:26:03 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی آسنکرون در پایتون (asyncio)</title>
                <link>https://virgool.io/coderlife/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A2%D8%B3%D9%86%DA%A9%D8%B1%D9%88%D9%86-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-mivbx6r9geed</link>
                <description>سلام دوستان :) شاید شما هم &quot;برنامه نویسی آسنکرون&quot; یا &quot;Asynchronous Programming&quot; خیلی به گوشتون خورده باشه و براتون جالب باشه که بدونید چی هست. در این پُست قراره با هم دیگه راجع به این موضوع صحبت کنیم و نحوه پیاده سازی اون در زبان پایتون رو بررسی کنیم.گرچه ممکنه برنامه نویسی آسنکرون ممکنه در ابتدا نسبت به روش برنامه نویسی سنتی که تا حالا دیده بودیم سخت به نظر برسه اما برای ما efficiency خوبی رو فراهم می کنه. چطور؟برای این که به این سوال جواب بدیم بهتره اول یکم راجع به مفاهیم Blocking و Non Blocking توضیح بدم.انباری و جعبه شماره 4 !تمامی افراد داخل صف باید منتظر انجام کار نفر اول بمانند!فرض کنین کالایی رو سفارش دادین و بهتون گفتن حضوی بیاین تحویل بگیرین. وقتی میرسید به محل تحویل کالا میبینین که کلی آدم دیگه توی صف هستند و منتظرند کالای خودشون رو بگیرن. نوبت شما میشه و شما کالای شماره 4 رو میخواین تحویل بگیرید. مسئول تحویل بهتون میگه که کالای شما دم دست نیست و باید اون رو از انباری بیاره که فاصله اش با اینجا کم نیست در عین حالی که این مسیر رو پیاده میخواد بره!! در این حالت قطعا اعصابتون خورد میشه و مجبورین چند ساعتی رو منتظر بمونین!! در واقع نه تنها شما بلکه همه اونایی که پشت سر شما هستند هم باید منتظر بمونن. اگه نفر بعدی کالای شماره 3 رو بخواد و این کالا همون نزدیکی باشه باید صبر کنه تا کالای شما تحویلتون داده بشه و این اصلا منطقی نیست. در این حالت گفته میشه تَسک مربوط به شما Blocking هست، چون کل صف، معطل انجام کار شما هستند که زمان بر هست.حالا اگه یه سرویس تحویل کالا داشته باشیم که با خودرو برای مامور تحویل، کالا رو بیاره اینطور میشه که وقتی نوبت به شما میرسه مامور، درخواست شما رو ثبت می کنه و میگه کنار بایستید و میره سراغ نفر بعد. هر زمان که سفارش شما برسه تحویل داده میشه و بقیه هم معطل نمیمونن. در این حالت تَسک شما Non Blocking هست و درخواست های بعدی به سرعت بررسی میشن.ارجاع سفارش به سرویس تحویل کالا صف را از حالت blocking خارج می کندحالا اگه یک نرم افزار مثل یک وب سرور ساده رو در نظر بگیرید که فقط یک Thread داره و همه درخواست های وب به سمت اون میان، تا زمانی که یک تَسک خیلی بزرگ به سمتش نیاد کارش رو انجام میده و نتیجه رو به کلاینت بر می گردونه. حالا برای این که از مشکل blocking جلوگیری کنیم داخل پایتون میتونیم یک async coroutine (که در ادامه توضیح میدیم) ثبت کنیم و بریم سراغ پاسخگویی به بقیه درخواست ها. بقیه زبان ها هم از چنین قابلیتی برخوردارند.تابعی به نام coroutineیک تابع آسنکرون در داخل پایتون &quot;coroutine&quot; نامیده میشه و توسط کتابخانه استاندارد پایتون به نام asyncio پشتیبانی میشه. coroutine فقط یک فانکشنی هست که از کلمه کلیدی async استفاده می کنه و یا داخل asincio.coroutine@ اون رو decorate می کنیم. دو فانکشن زیر در واقع هر دو نوع تعریف coroutine رو نشون میدن :&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; &quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; این دو، توابع خاصی هستن که وقتی صدا زده بشن آبجکتی به نام coroutine object رو بر می گردونن. دقت کنید که صدا زدن این توابع به معنی اجرا شدن اون ها نیست و فقط coroutine object بر می گردونن که بعدا برای اجرا به event loop پاس داده میشن تا اجرا بشن.هر زمانی که بخواهیم چک کنیم یک تابع، coroutine هست یا نه کافیه از تابع asyncio.iscoroutinefunction(func) استفاده کنیم. برای تشخیص coroutine object هم میتونیم از تابع asyncio.iscoroutine(obj) استفاده کنیم.عبارت yield fromراه های مختلفی برای صدا زدن یک coroutine وجود داره. یک روش استفاده از عبارت yield from هست. این عبارت در Python 3.3 معرفی شد و بعدا در Python 3.5 روش async/await ارائه شد که استفاده از اون نسبت به yield from توصیه میشه. (در ادامه معرفی می کنیم)عبارت yield from به صورت زیر استفاده میشه :&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; &quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; همونطور که میبینید yield from داخل فانکشنی که با asyncio.coroutine@ ، مشخص شده نوشته شده. اگر این عبارت رو خارج از این فانکشن تعریف کنید با خطای زیر مواجه میشید :اگر از این سینتکس قراره استفاده کنین باید حتما اون رو داخل فانکشن دیگه ای که با asyncio.coroutine@ مشخص شده (decorate شده) قرار بدین.استفاده از async/awaitسینتکس جدیدتر و تمیز تر async/await هست. عبارت async برای معرفی کردن یک فانکشن به عنوان coroutine استفاده میشه (شبیه کاری که asyncio.coroutine@ برامون انجام میده). نحوه استفاده از اون به این شکل هست :برای صدا زدن این فانکشن، به جای yield from از await استفاده می کنیم. درست مانند yield from حتما باید داخل یک coroutine دیگه ازش استفاده کنیم وگرنه خطای سینتکسی میگیریم. اجرای event loopهمه مباحثی که تا حالا گفتیم بدون اجرا کردن event loop کار نخواهند کرد! event loop در واقع محل اصلی اجرای توابع آسنکرون است. بنابراین هر زمان که واقعا می خواهیم یک تابع آسنکرون رو اجرا کنیم باید از event loop استفاده کنیم.استفاده از event loop یک سری ویژگی در اختیارمون میذاره :رجیستر کردن، اجرا و کنسل کردن توابع آسنکرونایجاد قابلیت ارتباط بین کلاینت و سرورایجاد subprosess ها برای برقراری ارتباط با برنامه های دیگرمحول کردن فراخوانی توابع به استخری از thread هاساختار کلی برنامه ای که از asyncio استفاده می کنه چیزی شبیه به کد زیر هست :&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; &quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; سه خط آخر رو با هم بررسی می کنیم:خط اول یعنی ()asyncio.get_event_loop میاد event loop پیشفرض رو فراخوانی میکنه.خط دوم یعنی ()loop.run_until_complete تابعی از نوع blocking هست و تا وقتی که همه توابع آسنکرون اجرا نشن چیزی رو return نمی کنه.خط آخر یعنی ()loop.close هم زمانی که اجرای حلقه تموم شد، حلقه رو متوقف می کنه.استفاده از event loop وقتی که برنامه رو به چند thread میشکنیم بسیار کمک کننده است. حالتی رو در نظر بگیرید که thread اصلی، منطق برنامه رو جلو می بره و بقیه thread ها عملیات های سنگین IO رو انجام میدن.و اما یک مثالحالا که فهمیدیم چطور از توابع آسنکرون استفاده کنیم، بهتره یه مثال بزرگتر با هم انجام بدیم تا همه چیز واضح بشه. مثالی که در ادامه می زنیم یک برنامه آسنکرون هست که یک سری داده به صورت JSON از سایت reddit واکِشی می کنه، اون ها رو parse می کنه و top post های روزانه /r/python و /r/programming و /r/compsci رو برامون چاپ می کنه.اولین تابع یعنی ()get_json که توسط ()get_reddit_top صدا زده میشه یک درخواست GET به url مورد نظر میفرسته. وقتی این تابع با استفاده از عبارت await فراخوانی میشه، event loop به کار خودش ادامه میده و به coroutine های دیگه سرویس میده و در عین حال هر زمان پاسخ GET رسید اون رو بر میگردونه. وقتی پاسخ برگشت به تابع ()get_reddit_top تحویل میشه، parse میشه و بعدش چاپ میشه.این کد یه مقدار با کدی که اول دیدیم تفاوت داره. برای اجرا کردن چندین coroutine داخل event loop از تابع asyncio.ensure_future استفاده کردیم و بعد از اون event loop رو اجرا کردیم تا همه coroutine ها رو پردازش کنه.نکته : قبل از اجرای این برنامه لازمه که با دستور زیر aiohttp رو نصب کنید. aiohttp یک فریمورک کلاینت/سروری آسنکرون مبتنی بر HTTP هست.حالا اگر برنامه رو اجرا کنیم نتیجه به صورت زیر خواهد بود :&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; &quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt;&quot;&gt; توجه کنید که اگر چند مرتبه برنامه را اجرا کنیم، ترتیب subreddit ها متفاوت خواهد بود و این به خاطر این است که هر کدام از coroutine هایی که صدا زده می شوند thread ای را رها کنند آن thread به coroutine دیگر اختصاص پیدا می کند. یعنی هر کدام زودتر کارش تمام شود زودتر چاپ می شود.ببخشید یکم طولانی شد ;)ممنوناقتباس از : https://stackabuse.com/python-async-await-tutorial/  https://www.nginx.com/blog/thread-pools-boost-performance-9x/  https://docs.python.org/3/library/asyncio.html </description>
                <category>علی سفیدموی</category>
                <author>علی سفیدموی</author>
                <pubDate>Sun, 10 Nov 2019 23:21:12 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Apache Kafka - مقدمه</title>
                <link>https://virgool.io/@ali-sefidmouy/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-apache-kafka-%D9%85%D9%82%D8%AF%D9%85%D9%87-rbcnf9cruqxj</link>
                <description>آپاچی کافکا یک پلتفرم قدرتمند برای تبادل پیام میان اپلیکیشن هاکافکا چیست؟آپاچی کافکا در یک جمله، یک پلتفرم سریع و مقیاس پذیر تبادل پیام میان اپلیکیشن ها است. امروزه از این پلتفرم در اغلب اپلیکیشن های توزیع شده استفاده می شود. یکی از ویژگی های بسیار خوب این پلتفرم، قابلیت دسترسی پذیری بالای (High availability) آن است. همچنین از قابلیت بازیابی خودکار نیز پشتیبانی می کند. این موضوع سبب می شود تا Kafka به عنوان راه حل مناسبی برای سیستم های داده ای مقیاس بزرگ شناخته شود.عملکرد کلی Kafka شامل مفاهیمی از قبیل Kafka Broker ، Kafka Producer و Kafka Consumer است که زیاد آن ها را می شنویم. Kafka Broker یک node در کلاستر Kafka است که برای ذخیره سازی و همچنین replicate کردن دیتا از آن استفاده می شود. Producer پیام ها را درون ظرفی به نام topic قرار می دهد. Consumer نیز پیام ها را از topic می خواند.در این مقدمه کوتاه به سراغ آشنایی بیشتر با مفهوم Messaging System در Kafka می رویم.سیستم تبادل پیام در Kafka :هنگامی که ما داده هایی را از یک اپلیکیشن به اپلیکیشن دیگری منتقل می کنیم در این جا از Messaging System استفاده می کنیم. در نتیجه استفاده از چنین سیستمی، بدون نگرانی از نحوه اشتراک داده ها، اپلیکیشن مان تنها بر روی خود داده ها تمرکز می کند. در کل دو نوع الگوی پیام رسانی وجود دارد. Point-to-Point و Publish-Subscribe. در ادامه با هر یک بیشتر آشنا خواهیم شد.سیستم تبادل پیام نقطه به نقطه (Point-to-Point) :در این سیستم، پیام ها همگی در یک صف نگهداری می شوند. همچنین یک پیام خاص صرفا توسط یک consumer می تواند consume شود. این سیستم پیام رسانی این اطمینان را می دهد که هر زمان که یک consumer یک پیام را از صف می خواند، آن پیام دیگر از آن صف محو خواهد شد.سیستم تبادل پیام  Publish-Subscribe :در این سیستم، پیام ها داخل ظرفی به نام topic قرار می گیرند (publish می شوند). در واقع در این سیستم، consumer ها می توانند در یک یا چند topic عضو شوند (subscribe کنند) و تمامی پیام های آن تاپیک ها را consume کنند.چرا باید از کلاستر Apache Kafka استفاده کنیم؟در مباحث big data معمولا با دو چالش اصلی مواجهیم. اولین چالش، جمع آوری حجم زیادی از داده ها بوده و چالش دوم تحلیل داده های جمع آوری شده می باشد. لازمه ی غلبه بر این دو چالش استفاده از یک messaging system است. Kafka این امکان را برایمان فراهم کرده است. چند ویژگی مهم Kafka عبارتند از:ردیابی فعالیت های وب برای پردازش Real Timeهشدار و گزارش متریک های عملیاتیتبدیل داده به فرمت استانداردپردازش مداوم داده های استریمآپاچی کافکا با ویژگی های گفته شده و به دلیل گستردگی استفاده به رویارویی با تکنولوژی های مشابه مانند ActiveMQ و RabbitMQ آمده است.در قسمت های بعدی با این پلتفرم قدرتمند بیشتر آشنا خواهیم شد.</description>
                <category>علی سفیدموی</category>
                <author>علی سفیدموی</author>
                <pubDate>Wed, 25 Sep 2019 10:43:38 +0330</pubDate>
            </item>
                    <item>
                <title>راه اندازی CI/CD Pipeline با استفاده از Jenkins و Docker</title>
                <link>https://virgool.io/@ali-sefidmouy/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-cicd-pipeline-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-jenkins-%D9%88-docker-tgmijzuw8qcl</link>
                <description>Docker + Jenkinsسلام به همه توسعه دهنده های عزیز :)این اولین پست من در ویرگول هست. دوست داشتم راجع به موضوعاتی بنویسم که توی منابع فارسی، کمتر بهش پرداخته شده. یکی از این موضوعات، مباحث کاربردی در Devops هست. بنابراین راه اندازی یک پایپلاینِ CI/CD توسط ابزار Jenkins که در اون از کامند های Docker هم استفاده شده رو برای اولین نوشته ام انتخاب کردم.  همین اول کار بگم که من خیلی در زمینه Devops حرفه ای نیستم و اگر اشکالی پیدا کردین، که حتما پیدا هم می کنین :) خوشحال میشم که توی کامنت ها بهم بگین. خب دیگه مقدمه چینی بسه و بریم سراغ راه اندازی پایپلاین مون.کلیت داستان اینه که یک برنامه به زبان جاوا داریم که بر روی گیت هاب قرار داره. میخوایم زمانی که ما یک کامیت رو به برنچِ master ، پوش (push) می کنیم، Jenkins بفهمه و یه سری کار ها رو برامون انجام بده :اول کد رو از روی گیت هاب pull کنهپروژه رو برامون پکیج کنه (اینجا که برنامه جاوایی هست، فایل WAR رو برامون بسازه) ایمیج داکر مربوط به پروژه رو برامون بسازهاز روی ایمیج مون یه کانتینر ایجاد کنه و اون رو اجرا کنه(در اینجا یک instance از Tomcat برامون اجرا کنه)البته مراحل بالا مراحلی بود که خودم تعریف کردم و شما طبق نیازتون میتونین مراحل دیگه ای مثل تست کردن، push کردن ایمیج داکر به Dockerhub و ... رو تعریف کنین.نیازمندی ها :سرور دبیان یا اوبونتو با دسترسی Sudo (اینجا من سرور دبیان رو انتخاب کردم، شما می تونین هر توزیعی که دوست دارین رو انتخاب کنین)جاواابزار mavenداکربعد از این که جاوا، maven و داکر رو نصب کردیم، مراحل زیر رو انجام میدیم : 1. مرحله اول : نصب و راه اندازی Jenkins روی سرور 01. با دستور زیر، کلید GPG مربوط به مخزنِ Jenkins رو import می کنیم :$ sudo wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -خروجی دستور بالا باید OK باشد.02. با دستور زیر، مخزنِ Jenkins رو به سیستم اضافه می کنیم :$ sudo sh -c &#039;echo deb http://pkg.jenkins.io/debian-stable binary/ &gt; /etc/apt/sources.list.d/jenkins.list&#039;03. حالا با دستورات زیر لیست پکیج مون رو آپدیت می کنیم و آخرین نسخه Jenkins رو نصب می کنیم :$ sudo apt update$ sudo apt install jenkins04. سرویس Jenkins رو استارت می کنیم و همینطور اون رو enable می کنیم تا موقع بوت شدن سیستم به طور خودکار آغاز به کار کنه :$ sudo systemctl start jenkins$ sudo systemctl enable jenkins05. داخل مرورگر به آدرس  http://your_ip_or_domain:8080 می ریم. با صفحه زیر مواجه میشیم:موقع نصب Jenkins ، یک رشته 32 کاراکتری به عنوان پسوورد ادمین، در محل زیر تولید میشه، این فایل رو باز کرده، پسوورد رو کپی می کنیم و اون رو داخل قسمت Administrator password وارد می کنیم  :$ sudo cat /var/lib/jenkins/secrets/initialAdminPasswordدر ادامه با صفحه زیر مواجه میشیم. اینجا گزینه سمت چپ رو انتخاب می کنیم :در صفحه بعدی طبق عکسی که می بینید، Jenkins شروع به نصب پلاگین های مورد نیاز می کنه : بعد از انجام شدن مرحله بالا، در صفحه بعد، Jenkins ازتون میخواد یک کاربر جدید بسازید. این کار رو انجام بدین. در نهایت با صفحه زیر مواجه میشین :صفحه اصلی Jenkins 2. مرحله دوم: پیکربندی های لازم برای CI/CD Pipeline الف. نصب پلاگین های مورد نیاز :    01. در قسمت سمت چپ صفحه اصلی به آدرس زیر می رویم :Manage Jenkins &gt; Manage Plugins   در تبِ available ، به دنبال پلاگین های SSH Pipeline Steps و Github Integration Plugin میگردیم و آن ها را نصب می کنیم. ب. راه اندازی Github Webhook :سرویس webhook در واقع نوعی متد HTTP POST است که یک اپلیکیشن از آن برای فراهم کردن اطلاعات بلادرنگ (Realtime) به سایر اپلیکیشن ها استفاده می کند.گیت هاب هم مثل خیلی از سرویس های دیگه دارای webhook هست که در ادامه اون رو راه اندازی میکنیم. اما این webhook به چه کارمون میاد؟ خُب. زمانی که ما یک کامیت رو به repository مون push می کنیم، گیت هاب با استفاده از این سرویس، به Jenkins اعلام می کنه که من یه Push جدید دریافت کردم، آقای Jenkins شما کدِ جدید رو از من بگیر و شروع به انجام مراحلی که برات توسط Pipeline تعریف شده بکن!خوبی webhook اینه که این کار به صورت خودکار انجام میشه و دیگه لازم نیست بعد از این که کد رو به گیت هاب Push کردین بیاین داخل Jenkins و Build now رو بزنین. 01.  ابتدا به صفحه repository خود داخل github رفته و به قسمت settings می رویم، سپس به قسمت Webhook می رویم و یک Webhook جدید ایجاد می کنیمدر قسمت payload URL آدرس زیر رو وارد می کنیم :http://your_ip_or_domain:8080/github-webhook/در ادامه Content-Type رو هم بر روی application/json قرار می دهیم،  Just the push event رو انتخاب می کنیم و Add Webhook رو میزنیم.ج. پیکربندی maven در Jenkinsبه آدرس زیر رفته و maven رو پیکربندی می کنیم : Manage Jenkins &gt; Global Tool Configuration   در قسمت maven ، بر روی Add maven کلیک می کنیم. نام &quot;maven3&quot; و آدرس maven رو که قبلا بر روی سیستم نصب کرده ایم می دهیم. (نامی که اینجا دادیم رو به یاد داشته باشین، بعدا اون رو مورد استفاده قرار میدیم) 3. مرحله سوم: راه اندازی CI/CD Pipeline 01. در مسیر Root پروژه در حال توسعه مون، فایلی به نام Jenkinsfile (دقیقا به همین نام باید باشد) ایجاد می کنیم و خطوط زیر که پایپلاین مون هست و به زبان Groovy نوشته شده رو داخل اون قرار میدیم :Jenkinsfile02. فایل دیگه ای که اون رو باید داخل مسیر روتِ پروژه قرار بدیم Dockerfile هست. این فایل ایمیج داکر نهایی مربوط به پروژه رو برامون میسازه. پس فایلی به همین نام ایجاد می کنیم و خطوط زیر رو در اون قرار میدیم :Dockerfile02. به صفحه اصلی Jenkins رفته و یک Item جدید از نوع Pipeline ایجاد می کنیم.در قسمت Build Triggers برای استفاده از Webhook ایجاد شده، عبارت زیر را علامت می زنیم :اسکرول کرده و به پایین می آییم. در بخش Pipeline ، قسمت Definition را بر رویPipeline Script from SCM قرار می دهیم و آدرس repository خود را به همراه نام برنچ (در این جا master) معرفی می کنیم.توجه : username و password مربوط به repository را داخل Jenkins باید به صورت credentials از قبل تعریف کرده باشیم.از این که طولانی شد عذرخواهی می کنم. موفق باشید ;)</description>
                <category>علی سفیدموی</category>
                <author>علی سفیدموی</author>
                <pubDate>Thu, 09 May 2019 18:47:58 +0430</pubDate>
            </item>
            </channel>
</rss>