دوره های آموزشی آکادمی پی وی لرن (پروژه محور و ویژه بازار کار)



  • ۲۳
  • مرداد

جلسه ۲۳ : برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت

  • دسته‌بندی‌ها :
جلسه ۲۳ : برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت

        با عرض سلام خدمت کاربران محترم سایت پی وی لرن.
        با جلسه ای دیگر از سری جلسات دوره آموزش زبان برنامه نویسی دارت Dart در خدمت شما هستیم.
        در این جلسه قصد داریم به آموزش برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت Dart بپردازیم.
        مفهوم برنامه نویسی غیر همزمان ممکن است کمی گیج کننده به نظر برسد اما کار با آن بسیار ساده است.

        برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت

        برنامه نویسی غیر همزمان مفهومی است که در آن دستورات یا کد های asynchronous به صورت مستقل از سایر دستورات اجرا می‌شود.
        در حالت عادی دستورات پشت سر هم اجرا می‌شوند و تا زمانی که اجرای یک دستور به پایان نرسیده است، دستورات بعدی اجرا نمی‌شوند.
        اما هنگامی که یک دستور asynchronous اجرا می‌شود، سایر دستورات برنامه به اجرای خود بدون توجه به این نوع دستورات ادامه می‌دهند.

        برنامه نویسی همزمان Synchronous

        مثال زیر را در نظر بگیرید:

        مثال : 

        ()readLineSync یک تابع synchronus (همزمان) است. (مانند تابع print)
        یعنی تمام دستوراتی که به دنبال این تابع آمده اند، تا زمانی که اجرای این تابع به پایان نرسد، اجرا نخواهد شد.
        این تابع منتظر ورودی کاربر می‌ماند و زمانی که کاربر آن را وارد کرد، این تابع مقدار آن ورودی را برمی‌گرداند.

        خروجی مثال بالا به شکل زیر است:

        مثال : 

        برنامه نویسی غیر همزمان Asynchronous

        مشکل برنامه نویسی همزمان یا synchronous در این است که اگر اجرای یک تابع مدت زیادی طول بکشد، سایر کد های برنامه منتظر اجرا می‌مانند.
        برای رفع این مشکل از تکنیک برنامه نویسی غیر همزمان یا Asynchronous استفاده می‌کنیم.
        در این روش می‌توانیم یک تابع را را به صورت async تعریف و اجرا کرده و همزمان، سایر کد های برنامه که به دنبال آن تابع آمده اند نیز می‌توانند اجرا شوند. (نمیدونم چرا اسم این روش رو گذاشتن غیر همزمان!)

        به نظر می‌رسد در برنامه نویسی غیر همرمان نیز یک مشکل وجود دارد.
        فرض کنید برنامه ای نوشته اید یک یک عکس را از اینترنت دریافت کرده و آن را نمایش می‌دهد.
        از آن جایی که تابع دریافت تصویر از اینترنت را به صورت async پیاده سازی کرده ایم، سایر کد های برنامه نیز همزمان با اجرای این تابع، اجرا خواهد شد.
        یعنی تابع مربوط به نمایش تصویر نیز اجرا خواهد شد اما به درستی کار نخواهد کرد زیرا تصویر هنوز به صورت کامل دریافت نشده است.
        در اینجا احساس می‌شود که تابع نمایش تصویر باید پس از اجرای کامل تابع دریافت تصویر (async) اجرا شود.

        برای این مشکل راه حل ساده ای وجود دارد.
        باید کاری کنیم که تابع async مثل synchronous عمل کند.
        برای این کار دو روش وجود دارد:

        • استفاده از async و await
        • استفاده از تابع then

        استفاده از async و await

        کد هایی که از async و await استفاده می‌کنند، به صورت غیر همزمان اجرا می‌شوند.

        await حتما باید در یک تابع async اجرا شود.
        استفاده از await با یک تابع باعث می‌شود تا سایر کد ها تا زمانی که اجرای آن تابع تمام نشده است، اجرا نشوند.

        در مثال زیر، تا زمانی که اجرای تابع ()lookUpVersion به صورت کامل تمام نشده است، سایر کدهای تابع ()checkVersion (در اینجا تابع print) اجرا نخواهد شد.

        مثال : 

        Future یک کلاس در کتابخانه dart:async است. از این کلاس برای دریافت مقدار برگشتی یک تابع async استفاده می‌کنیم.(در مثال بالا هیچ مقداری برگشت داده نمی‌شود)
        همچنین وجود کلاس Future برای استفاده از تابع ()then ضروری است که در ادامه به توضیح آن می‌پردازیم.

        از await می‌توانیم چندین بار در یک تابع async استفاده کنیم:

        مثال : 

        حال مثال کلی زیر  را درنظر بگیرید:

        مثال : 

        خروجی آن به شکل زیر است:

        مثال : 

        استفاده از متد ()then

        متد then از طریق یک تابع که یک مقدار Future را برمی‌گرداند، فراخوانی می‌شود.
        این متد یک تابع را به عنوان پارامتر گرفته و آن تابع را پس از اجرای کامل تابعی که آن را فراخوانی کرده است، اجرا می‌کند.

        تعدادی از توابع زبان دارت یک مقدار Future برمی‌گردانند. پس می‌توان از متد then بر روی این توابع استفاده کرد.
        مانند تابع ()HttpRequest.getString .

        نکته: تابعی که یک مقدار Future برمی‌گرداند، به صورت Async یا غیر همزمان اجرا می‌شود.

        مثال:

        فرض کنید فایلی به نام context.txt با محتویات زیر داریم:

        مثال : 

        برنامه زیر محتویات این فایل را خوانده و آن ها را نمایش می‌دهد.

        مثال : 

        خروجی:

        مثال : 

         

        جلسه آموزش برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت نیز به پایان رسید.

        در جلسه بعد به آموزش isolate ها در زبان دارت Dart خواهیم پرداخت.

        QR:  جلسه ۲۳ : برنامه نویسی غیر همزمان (Asynchronous) در زبان دارت
        به اشتراک بگذارید


        دیدگاه کاربران
        1. تصویر کاربر
        2. تصویر کاربر
        3. تصویر کاربر