PDA

View Full Version : کاربرد Isolate در فلاتر



hharddy
چهارشنبه 06 دی 1402, 11:36 صبح
برنامه نویسی چند نخی (Multithreading) یک تکنیک برنامه نویسی است که به برنامه نویسان این امکان را می دهد تا چندین کار را به طور همزمان در یک برنامه اجرا کنند. هر کار در یک نخ جداگانه اجرا می شود.
برنامه نویسان می‌توانند با استفاده از multi thread، برنامه‌هایی بنویسند که در حالت موازی چندین عملیات را انجام می‌دهند، که می‌تواند به سرعت اجرای بهتر و بهتر برنامه را به شکلی که کاربر بهترین تجربه را دریافت می‌کند به شکلی که کاربر بهترین تجربه را دریافت می‌کند، کمک کند.
زمانی که برنامه‌ی فلاتر اجرا می‌شود، یک main thread یا isolate برای برنامه‌ی شما ایجاد می‌شود که کدهای شما داخل اون thread یا isolate اجرا می‌شن که بهش main thread یا UI thread گفته میشود.
بین isolate ها حافظه‌ی مشترکی وجود ندارد.
برای برقراری ارتباط بین isolate ها از port و message ها برای تبادل پیام استفاده میشود.
در برنامه‌های ساده‌ی فلاتر معمولاً یک isolate وجود دارد، اما درصورتی که قصد انجام عملیاتی طولانی و سنگین رو داشته باشید، برای اینکه عملکرد UI Thread مختل نشه، بهتر هست که برای انجام آن یک Isolate جدید ایجاد کنید.

در اینجا برای شبیه سازی یک عملیات پردازش سنگین متد TestTask را هنگام کلیک کردن روی دکمه فراخوانی میکنیم.




Future<int> TestTask(SendPort sendPort)async
{
var result = 0;
for(int i = 0; i<1450000000;i++)
{ result++; }
sendPort.send('Result: $result');
return result;
}





همانطور که گفتیم راه ارتباطی بین Isolateها در فلاتر از طریق ارسال پیام میباشد. در صورتی که بخواهید به یک Isolate دیگر پیامی ارسال کنید از SendPort کمک میگیریم.
در اینجا نیز نتیجه نهایی پردازش را از همین طریق به Isolate اصلی برنامه ارسال میکنیم.
برای شروع یک isolate جدید نیز به صورت زیر عمل میکنیم.





var rec_port = ReceivePort();
var isolates = await Isolate.spawn(TestTask,rec_port.sendPort);
rec_port.listen((message) {
print("Message: $message");
}
);

برای ساخت Isolate جدید هم از متد Isolate.spawn استفاده میکنیم.
پارامتر اول این متد همان تابع پیاده سازی شده است که میخواهیم در یک Thread جدید قرار گیرد و پارامتر دوم هم در واقع آرگومان های مورد نیاز تابع TestTask میباشد که از همان ReceivePort مقدار SendPort را قرار داده ایم.


منبع: آموزشی Isolate در فلاتر و برنامه نویسی Multi Thread + فیلم (https://flutter-learn.ir/flutter-isolate-multi-thread/)