FULLSTACKDEVS Telegram 501
#IOBound
#CPU_Bound
#AsynchronousProgramming
#Async #Await

✳️ CPU vs. I/O-Bound Code

🔸 برای تشخیص اینکه چه زمانی از Task.Run استفاده کنیم. ابتدا نیاز به دانستن تفاوت بین کد های CPU-bound و I/O-bound داریم.

🔹 CPU-Bound
🔸 وقتی کدی CPU-Bound باشد اساسا این منظور را میرساند که پردازنده کامپیوتر یا به طور خاص thread ای در پردازنده، جایی است که به واسطه اجرای آن کد دچار ترافیک و صرف زمان زیاد خواهد شد.
▫️ در زمان اجرای کد های CPU-Bound پردازنده تا جای ممکن با سرعت به اجرای چنین کدهایی میپردازد اما با این وجود باز هم مدت زمانی که صرف اجرای چنین کدهایی خواهد شد قابل توجه خواهد بود. به عبارت دیگر در اجرای چنین کدهایی پردازنده محلی است که شما را از اجرای سریعتر باز میدارد و میتوانیم بگوییم که اجرای این کد ها باعث delay در پردازنده خواهد شد.

🔹 I/O-Bound Code
🔸 در مقابل در کد های I/O-Bound نرخ انتقال داده در دستگاه های ورودی و یا خروجی و یا عملیات های ورودی و خروجی عاملی است که باعث ایجاد delay خواهد شد.
مانند خواندن یا ذخیره کردن داده ها از یک فایل یا برقراری ارتباط با سرور جهت دانلود یا آپلود و ...
▫️ در همه این عملیات ها پردازنده تا حدودی بیکار است به این خاطر که منتظر اتمام ارسال و دریافت داده ها میباشد. در صورتی که عملیات I/O-Bound یک ارتباط با یک سرور خارجی باشد و به هر دلیلی اتصال به درستی برقرار نشود احتمالا پردازنده کاملا بیکار خواهد بود تا زمانی که ارتباط برقرار شود.

🔸 همانطور که متوجه شدید گرچه در هر دو عملیات های CPU vs. I/O-Bound تاخیر (delay) وجود دارد اما این عملیات ها در ذات کاملا متفاوت هستند.

✳️ Nature of Asynchronous operation

اصولا استفاده از Task,Run برای اجرای یک عملیات در thread ای جدا، برای عملیات های CPU Bound مسمر ثمر است، ام نه برای عملیات های I/O Bound. ولی چرا ⁉️

🔸 اکثر کامپیوترهای امروزی چندین هسته دارند که کمی شبیه این است که انگار چندین پردازنده دارند. زمانی که اپلیکیشن شروع به اجرا شدن میکند دسته ای از thread ها توسط .Net runtime ساحته میشود تا اپلیکیشن از آنها استفاده کند.
تعداد این thread ها به تعداد هسته های پردازنده کامپیوتر مرتبط است
در نتیجه اگر thread اصلی اپلیکیشن مشغول باشد می توانیم با استفاده از Task.Run عملیات سنگین خود را به لطف پردازنده چند هسته ای مان در thread ای جدا اجرا کنیم .

🔻توجه داشته باشید که thread و core گرچه مرتبط هستند اما با هم تفاوت دارند .
یک thread یک مفهوم نرم افزاری است و یک core یک ابزار سخت افزاری .
▫️ این امکان وجود دارد تا هر چند thread ای که میخواهید بسازید اما تعداد core ها ثابت است .

🔸 وقتی Task.Run را صدا میزنید یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد و این امر بهبود عملکردی را برای اپلیکیشن به ارمغان می آورد.

🔸 وقتی که یک عملیات I/O Bound را با استفاده از Task.Run اجرا میکنید بر روی یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد ولی در اون thread هم باز باید برای دریافت داده ها، منتظر اتمام عملیات I/O باشد.
اینکار ممکن است روشی سریع و آسان برای پاسخگو نگه داشتن اپلیکیشن برای انجام فرامین کاربران باشد اما راه کارآمدی برای استفاده هر چه بهتر منابع سیستم نیست.

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

🔸 به منظور استفاده از await برای عملیات های I/O Bound بدون استفاده کردن از Task.Run لازم است که از یک متد asynchronous استفاده کنید که یک Task را return کند. خود این متد نباید از Task.Run استفاده کرده باشد .
انجام این کار زمانی که دارید با کلاس های از پیش ساخته شده .Net نظیر FileStream
و HttpClient کار میکنید، ساده است زیرا این کلاس ها برای اعمال خود متد های asynchronous را در اختیار مان قرار میدهند.
گاهی ممکن است کلاسی در درون .net یا یک لایبری فقط متد های synchronous در اختیار مان قرار دهد که در این موارد ممکن مجبور شوید تا از Task.Run استفاده کنید.
اما همیشه و تا جای ممکن از async و await به جای Task.Run برای عملیات های I/O Bound استفاده کنید.

@FullStackDevs



tgoop.com/fullStackDevs/501
Create:
Last Update:

#IOBound
#CPU_Bound
#AsynchronousProgramming
#Async #Await

✳️ CPU vs. I/O-Bound Code

🔸 برای تشخیص اینکه چه زمانی از Task.Run استفاده کنیم. ابتدا نیاز به دانستن تفاوت بین کد های CPU-bound و I/O-bound داریم.

🔹 CPU-Bound
🔸 وقتی کدی CPU-Bound باشد اساسا این منظور را میرساند که پردازنده کامپیوتر یا به طور خاص thread ای در پردازنده، جایی است که به واسطه اجرای آن کد دچار ترافیک و صرف زمان زیاد خواهد شد.
▫️ در زمان اجرای کد های CPU-Bound پردازنده تا جای ممکن با سرعت به اجرای چنین کدهایی میپردازد اما با این وجود باز هم مدت زمانی که صرف اجرای چنین کدهایی خواهد شد قابل توجه خواهد بود. به عبارت دیگر در اجرای چنین کدهایی پردازنده محلی است که شما را از اجرای سریعتر باز میدارد و میتوانیم بگوییم که اجرای این کد ها باعث delay در پردازنده خواهد شد.

🔹 I/O-Bound Code
🔸 در مقابل در کد های I/O-Bound نرخ انتقال داده در دستگاه های ورودی و یا خروجی و یا عملیات های ورودی و خروجی عاملی است که باعث ایجاد delay خواهد شد.
مانند خواندن یا ذخیره کردن داده ها از یک فایل یا برقراری ارتباط با سرور جهت دانلود یا آپلود و ...
▫️ در همه این عملیات ها پردازنده تا حدودی بیکار است به این خاطر که منتظر اتمام ارسال و دریافت داده ها میباشد. در صورتی که عملیات I/O-Bound یک ارتباط با یک سرور خارجی باشد و به هر دلیلی اتصال به درستی برقرار نشود احتمالا پردازنده کاملا بیکار خواهد بود تا زمانی که ارتباط برقرار شود.

🔸 همانطور که متوجه شدید گرچه در هر دو عملیات های CPU vs. I/O-Bound تاخیر (delay) وجود دارد اما این عملیات ها در ذات کاملا متفاوت هستند.

✳️ Nature of Asynchronous operation

اصولا استفاده از Task,Run برای اجرای یک عملیات در thread ای جدا، برای عملیات های CPU Bound مسمر ثمر است، ام نه برای عملیات های I/O Bound. ولی چرا ⁉️

🔸 اکثر کامپیوترهای امروزی چندین هسته دارند که کمی شبیه این است که انگار چندین پردازنده دارند. زمانی که اپلیکیشن شروع به اجرا شدن میکند دسته ای از thread ها توسط .Net runtime ساحته میشود تا اپلیکیشن از آنها استفاده کند.
تعداد این thread ها به تعداد هسته های پردازنده کامپیوتر مرتبط است
در نتیجه اگر thread اصلی اپلیکیشن مشغول باشد می توانیم با استفاده از Task.Run عملیات سنگین خود را به لطف پردازنده چند هسته ای مان در thread ای جدا اجرا کنیم .

🔻توجه داشته باشید که thread و core گرچه مرتبط هستند اما با هم تفاوت دارند .
یک thread یک مفهوم نرم افزاری است و یک core یک ابزار سخت افزاری .
▫️ این امکان وجود دارد تا هر چند thread ای که میخواهید بسازید اما تعداد core ها ثابت است .

🔸 وقتی Task.Run را صدا میزنید یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد و این امر بهبود عملکردی را برای اپلیکیشن به ارمغان می آورد.

🔸 وقتی که یک عملیات I/O Bound را با استفاده از Task.Run اجرا میکنید بر روی یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد ولی در اون thread هم باز باید برای دریافت داده ها، منتظر اتمام عملیات I/O باشد.
اینکار ممکن است روشی سریع و آسان برای پاسخگو نگه داشتن اپلیکیشن برای انجام فرامین کاربران باشد اما راه کارآمدی برای استفاده هر چه بهتر منابع سیستم نیست.

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

🔸 به منظور استفاده از await برای عملیات های I/O Bound بدون استفاده کردن از Task.Run لازم است که از یک متد asynchronous استفاده کنید که یک Task را return کند. خود این متد نباید از Task.Run استفاده کرده باشد .
انجام این کار زمانی که دارید با کلاس های از پیش ساخته شده .Net نظیر FileStream
و HttpClient کار میکنید، ساده است زیرا این کلاس ها برای اعمال خود متد های asynchronous را در اختیار مان قرار میدهند.
گاهی ممکن است کلاسی در درون .net یا یک لایبری فقط متد های synchronous در اختیار مان قرار دهد که در این موارد ممکن مجبور شوید تا از Task.Run استفاده کنید.
اما همیشه و تا جای ممکن از async و await به جای Task.Run برای عملیات های I/O Bound استفاده کنید.

@FullStackDevs

BY Web Devs


Share with your friend now:
tgoop.com/fullStackDevs/501

View MORE
Open in Telegram


Telegram News

Date: |

‘Ban’ on Telegram To upload a logo, click the Menu icon and select “Manage Channel.” In a new window, hit the Camera icon. How to Create a Private or Public Channel on Telegram? Image: Telegram. Those being doxxed include outgoing Chief Executive Carrie Lam Cheng Yuet-ngor, Chung and police assistant commissioner Joe Chan Tung, who heads police's cyber security and technology crime bureau.
from us


Telegram Web Devs
FROM American