سیستم وظایف

ساخت وبلاگ

سیستم وظایف یک مدیر کار است که قابلیت اجرای کد گیم پلی شما را به صورت غیر همزمان فراهم می کند. این برنامه از ساختمان و اجرای یک نمودار محرک کارگردانی کارهای وابسته پشتیبانی می کند. این کار در TaskGraph ، مدیر شغل مورد استفاده در موتور Unreal (UE) بهبود می یابد. سیستم کار و TaskGraph هر دو از همان زمینه (برنامه زمانبندی و کارگران) استفاده می کنند.

ویژگی های اصلی عبارتند از:

راه اندازی یک کار با ارائه یک شیء قابل تماس که باید به صورت ناهمزمان اجرا شود.

منتظر تکمیل کار و/یا بازیابی نتیجه اجرای کار.

مشخص کردن پیش نیازهای کار - سایر کارها که باید قبل از شروع کار انجام شود.

راه اندازی وظایف تو در تو از داخل یک کار. کار والدین تا تمام کارهای تو در تو به پایان نرسیده است.

زنجیره های کار ساختمانی ، همچنین به عنوان لوله شناخته می شوند.

استفاده از رویدادهای کار برای هماهنگ سازی و سیگنالینگ بین کارها.

همه نمونه های کد با استفاده از نام های نام UE :: وظایف برای کوتاه بودن فرض می کنند.

راه اندازی

برای راه اندازی یک کار ، شما باید نام اشکال زدایی کار و یک شیء قابل تماس با عنوان "بدنه وظیفه" را ارائه دهید. مثلا:

کد بالا کار را راه اندازی می کند که عملکرد داده شده را به صورت ناهمزمان اجرا می کند. اولین پارامتر نام اشکال زدایی کار (ترجیحاً منحصر به فرد) است. هدف آن کمک به کارهای اشکال زدایی و کمک به یافتن کدی است که کار را راه اندازی کرده است.

ue_source_location یک کلان است که رشته ای را در نام پرونده فرمت فایل منبع و خطی که در آن استفاده می شود ایجاد می کند. این مثال یک کار "آتش و فراموش" را نشان می دهد ، این بدان معنی است که شما نیازی به مراقبت از آنچه در این کار اتفاق می افتد پس از راه اندازی آن ، زیرا در نهایت اجرا می شود.

غالباً باید منتظر تکمیل کار باشید یا نتیجه اجرای آن را بازیابی کنید. این کار را می توان با استفاده از شیء کار برگشت داده شده توسط تماس پرتاب انجام داد:

اجرای کار می تواند نتیجه ای را برگرداند. ftask نام مستعار ttask است ، تخصصی از ttask عمومی. ResultType باید با نوع نتیجه برگشتی توسط بدنه کار مطابقت داشته باشد:

وظایف به صورت ناهمزمان و بالقوه همزمان با موضوع پرتاب اجرا می شوند ، بنابراین ترتیب اجرای آنها تعریف نشده است. اگرچه ما هنوز هم می توانیم با مشخص کردن اولویت کار ، در دستور اجرای وظایف تأثیر بگذاریم. اولویت های کار "بالا" ، "عادی" (پیش فرض) ، "پس زمینه بالا" ، "پس زمینه عادی" و "پس زمینه کم" است. وظایف با اولویت بالاتر قبل از انجام وظایف با اولویت پایین انجام می شود.

یک تابع Lambda به طور معمول به عنوان یک بدنه وظیفه استفاده می شود ، اگرچه می توان از هر شیء قابل تماس نیز استفاده کرد.

جزییات فنی

FTASK دسته ای از یک کار واقعی است که شبیه به یک نشانگر هوشمند است. از شمارش مرجع برای مدیریت عمر خود استفاده می کند. راه اندازی یک کار عمر خود را آغاز می کند و منابع مورد نیاز را تخصیص می دهد. برای انتشار یک مرجع نگهدارنده می توانید دسته کار را با استفاده از موارد زیر "تنظیم مجدد" کنید:

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

برای اطلاعات بیشتر به راه اندازی مراجعه کنید.

منتظر تکمیل کار

شما اغلب ممکن است نیاز داشته باشید که آیا یک کار به اتمام رسیده است ، منتظر تکمیل آن یا بازیابی نتیجه اجرای آن است.

بررسی کنید که آیا یک کار به اتمام رسیده است

bool bcompleted = task. iscompleted () ؛

منتظر تکمیل کار باشید

منتظر اتمام کار با Timeout باشید

bool btaskcompleted = task. wait (ftimespan :: frommillisecond (100)) ؛

صبر کنید تا تمام کارها به پایان برسد

نتیجه اجرای کار را بازیابی کنید. تماس تا زمان اتمام کار مسدود شده و نتیجه آن آماده است.

در صورت امکان انتظار باید از انتظار جلوگیری کرد ، زیرا مقیاس پذیری را محدود می کند. درعوض ، ما توصیه می کنیم با تعریف وابستگی بین وظایف و طراحی API های ناهمزمان مبتنی بر کار ، نمودارهای کار را بسازید. برای اطلاعات بیشتر به Wait و GetResult () مراجعه کنید.

پریشان

مشکل انتظار برای تکمیل کار این است که موضوع فعلی را مسدود می کند ، بنابراین مفید نیست. یک روش جایگزین استفاده از Waiting Busy است. هنگام استفاده از WAITING ، موضوع سعی خواهد کرد تا کارهای دیگر را انجام دهد تا زمانی که کاری که منتظر آن است به اتمام برسد.

در حالی که انتظار برای انتظار می تواند در یک محیط کنترل شده مفید باشد ، این مجموعه از مشکلات خاص خود را دارد و باید با احتیاط استفاده شود. مسئله اصلی این است که نمی توان کنترل کرد که کدام وظایف توسط برنامه ریزی انتخاب می شود که در هنگام انتظار برای انتظار اجرا شود.

این می تواند منجر به بن بست شود (به این معنی که یک موضوع مشغول انتظار است و یک mutex غیر Reentrant را قفل کرده است در حالی که یک کار انتخاب شده توسط برنامه ریز سعی کرده است همان Mutex را قفل کند) ، یا نتیجه بدتری را در جایی که برنامه ریزی طولانی مدت انتخاب می کند-کار در حالی که مشغول انتظار برای یک کار کوتاه تر در مسیر بحرانی است.

برای کسب اطلاعات بیشتر به BusyWait () مراجعه کنید.

پیش نیازها

کارها می توانند به سایر کارها وابستگی داشته باشند. اگر وظیفه A فقط پس از اتمام کار B قابل اجرا باشد ، پس از آن وظیفه B پیش نیاز وظیفه A و وظیفه A نامیده می شود که متعاقب آن از کار B. نامیده می شود. این امکان ایجاد یک نمودار حرکتی کارگردانی را فراهم می کند.

مزیت اصلی استفاده از وابستگی های کار این است که موضوعات کارگر را مسدود نمی کند. علاوه بر این ، وابستگی ها به شما امکان می دهند دستور اجرای وظیفه را مجبور کنید ، که به طور معمول تضمین نمی شود. کد زیر یک پیش نیاز ساده برای وابستگی بعدی ایجاد می کند:

در مثال کد زیر ، پیش نیازها () یک عملکرد یاور است:

task-diagram-flow-example

برای اطلاعات بیشتر به راه اندازی مراجعه کنید.

کارهای تو در تو

کارهای تو در تو در توجیه مشابه پیش نیازها هستند ، اما در حالی که پیش نیازها وابستگی های اعدام هستند ، وظایف تو در تو وابستگی تکمیل هستند. وظیفه A را در نظر بگیرید که وظیفه B را در حین اجرای آن راه اندازی می کند ، و وظیفه A فقط با اتمام اجرای آن و کار B انجام می شود. این یک الگوی متداول است که یک سیستم یک رابط ASYNC مبتنی بر کار را در معرض نمایش قرار می دهد ، اما کار B بخشی از اجرای است بنابراین نشت این کار نامطلوب است.

ساده ترین اجرای به شرح زیر خواهد بود:

این یک اجرای اساسی برای انجام کار است ، اما ناکارآمد است زیرا وظیفه اجرای موضوع کار A در انتظار تکمیل وظیفه B مسدود شده است ، بنابراین از آن برای انجام سایر کارها استفاده نمی شود.

راه حل استفاده از کارهای تو در تو است. در مثال ما ، وظیفه A یک کار والدین است و وظیفه B یک کار تو در تو است زیرا اجرای آن باید در داخل اجرای وظیفه A توخالی شود:

AddNuredte کار داده شده را به عنوان تو در تو کارهایی که توسط موضوع فعلی انجام می شود ، اضافه می کند. ادعا می کند اگر از داخل یک کار فراخوانی نشده باشد.

برای اطلاعات بیشتر به AddNested () مراجعه کنید.

لوله های

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

برای منابع پیچیده ، مطلوب است که یک رابط ASYNC ارائه دهید که به یک عملیات ASYNC اجازه می دهد تا روی منبع کار کند و امکان بررسی اینکه آیا این عملیات به اتمام رسیده است (یا عضویت در اعلان تکمیل) است.

اجرای یک رابط ASYNC اغلب یک کار بی اهمیت نیست. لوله ها برای ساده تر کردن این کار طراحی شده اند. هدف این است که یک لوله در هر منبع مشترک داشته باشید. تمام دسترسی ها به منابع مشترک در داخل کارهای انجام شده توسط لوله انجام می شود. مثلا:

FTHREADSAFERESOURCE یک رابط کاربری ASYNC از امنیت عمومی را بر اساس کارها فراهم می کند. این یک منبع مسافت موضوعی را محاصره می کند. اجرای ساده است و از کد دیگ بخار تشکیل شده است. هرگونه دسترسی به منبع موضوعی در داخل کارهای لوله کشی اتفاق می افتد.

از آنجا که این کارهای لوله کشی به صورت متوالی انجام می شود ، نیازی به هماهنگی اضافی نیست. لوله ها اشیاء سبک وزن هستند ، بنابراین مجموعه ای از وظایف خود را ذخیره نمی کنند. امکان داشتن هزاران لوله بدون افت قابل توجه در عملکرد وجود دارد.

برای تهیه یک کار ، باید توسط یک لوله راه اندازی شود:

Taska و TaskB همزمان اجرا نمی شوند ، بنابراین برای دسترسی به یک منبع مشترک ، نیازی به همگام سازی با یکدیگر ندارند. در حالی که بیشتر اوقات ترتیب اعدام قابل پیش بینی است ، نظمی که در آن کارها راه اندازی می شود تضمین نمی شود.

وظایف لوله کشی از همان ویژگی هایی که سایر کارها انجام می دهند ، پشتیبانی می کنند ، به عنوان مثال ، آنها می توانند وابستگی داشته باشند و ترتیب رفتار را دنبال کنند. ابتدا وابستگی ها برطرف می شوند و از این طریق یک کار لوله کشی می شود. این بدان معنی است که یک کار با وابستگی در انتظار ، اجرای لوله را مسدود نمی کند و وابستگی ها می توانند دستور اجرای وظایف لوله را تغییر دهند.

می توانید لوله ها را به عنوان موضوعات سبز در نظر بگیرید. این موضوعات سبز توسط موضوعات کارگر اجرا می شوند و می توانند "موضوعات پرش" را انجام دهند. به عنوان مثال ، در مثال قبلی ، TaskA و TaskB می توانند توسط موضوعات مختلف اجرا شوند.

لوله های API از موضوع ایمن هستند.

اشیاء لوله غیر قابل کپی و غیر قابلمه هستند.

راه اندازی یک کار در چندین لوله امکان پذیر نیست.

برای اطلاعات بیشتر به FPIPE مراجعه کنید.

وقایع کار

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

در زیر یک جدول وجود دارد که نمونه هایی از آنچه می توان با استفاده از رویدادهای کار انجام داد.

مثال رویداد

یک کار را راه اندازی کنید اما اجرای آن را تا زمان انتشار صریح انجام دهید.

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

از یک رویداد کار به عنوان یک کار وصل کنید.

وصل کننده به TaskA و TaskB بستگی دارد. انتظار برای آن به معنای انتظار برای همه وابستگی های آن به جای انتظار برای آنها به صورت جداگانه است.

پیش نیازها () یک عملکرد یاور است.

اجرای وظیفه را در وسط متوقف کنید و منتظر بمانید تا یک رویداد اتفاق بیفتد.

به طور کلی ، انتظار در وسط یک کار بهترین ایده به دلایل عملکرد و مقیاس پذیری نیست. اگر خود را در چنین شرایطی پیدا کردید ، در صورت امکان دوباره طراحی مجدد با پیش نیازها را در نظر بگیرید.

یک کار را انجام دهید اما آن را به صورت خودکار انجام ندهید. در عوض ، "کامل" را صریحاً وقتی راحت باشد

اشکال زدایی و پروفایل

هر کار ، رویداد کار یا لوله دارای نام اشکال زدایی با کاربر است. این امر به توانایی شناسایی آنها در طول زمان اجرا در اشکال زدایی اجازه می دهد. تجسم کننده های بومی ویژوال استودیو برای بررسی وضعیت داخلی آنها ارائه شده است.

Unreal Insights کانال ردیابی کار را اضافه می کند که امکان تجسم وظایف و وقایع طول عمر آنها را فراهم می کند. مانند زمان راه اندازی ، برنامه ریزی ، اجرا و تکمیل.

اشکال زدایی و پروفایل مناطق فعال توسعه است و در آینده بیشتر بهبود می یابد.

کتاب آموزش بورس...
ما را در سایت کتاب آموزش بورس دنبال می کنید

برچسب : نویسنده : محمود استادمحمد بازدید : 47 تاريخ : يکشنبه 10 ارديبهشت 1402 ساعت: 15:27