PDA

View Full Version : ایجاد یک حلقه بی نهایت به صورت - موازی Parallel



jblaox
جمعه 30 فروردین 1392, 18:15 عصر
سلام
مین میخواهم یک حلقه بی نهایت ایجاد کنم ، هدف من هم این است که دو عدد تصادفی غیر یکسان تولید کنم
برای این کار از یک حلقه For به صورت بی نهایت استفاده کردم ام و همچنین دستور break .

حالا میخواهم این بخش موازی کنم اما نمیدوم که چگونه میتوانم یک حلقه بی نهایت به صورت Parallel ایجاد کنم :

در حالت عادی دارم :

int Random_Number; // متغییر عدد تصادفی
for (;;)
{
// --------------------------------
// متد تولید عدد تصادفی واقعی
byte[] Random_Number_temp = new byte[1];
RNGCryptoServiceProvider.Create().GetBytes(Random_ Number_temp);
string str_temp = Random_Number_temp[0].ToString();

// --------------------------------
// بررسی طول عدد اگر دو رقمی بود قابل قبول
if (str_temp.Length >= Max_Length)
{
Random_Number = int.Parse(str_temp);
// اگر عدد در محدوده مورد نظر بود از حلقه خارج می شود
if (min <= Random_Number && Random_Number <= max)
{
break;
}
}
}

من با :

Parallel.For

آشنایی دارم اما با ان نمیتوانم یک حلقه بی نهایت ایجاد کنم .

مبین رنجبر
جمعه 30 فروردین 1392, 18:52 عصر
اگر مثلا میخواهید از 2-3 و یا تعداد کمی از حلقه موازی استفاده کنید بهترین راه استفاده از Thread هست

C#‎_best_Programmer
جمعه 30 فروردین 1392, 19:02 عصر
آره اصلا وقتی حرف از بی نهایته بحث رشتم مطرحه

jblaox
جمعه 30 فروردین 1392, 20:41 عصر
سلام

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

من به دنبال یک راه حل مناسب برای Parallel کردن یک حلقه بی نهایت میگردم ، هم اکنون راه حلی دارم اما پیچیده و نا مناسب است :


ابتدا از کلاس زیر تعریف میکنیم :

public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}

private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}

سپس اینگونه استفاده میکنیم :

Func<bool> whileCondFn = () => !flag_t;
ParallelUtils.While(whileCondFn, delegate()
{
//
});

مبین رنجبر
جمعه 30 فروردین 1392, 21:08 عصر
دوست عزیز وقتی شما سوالی رو در تالار سی شارپ مطرح میکنید یعنی اینکه انتظارات شما در چهارچوب سی شارپ هست و جوابی هم که میگیرید خارج از این محیط نیست.در سی شارپ با مفهوم موازی اینطور برخورد میشود و امکانات مشخصی دارد.خواه سودمند و بدون مشکل ، خواه بی کاربرد و مشکل دار.

یک راه حل مناسب تغییر زبان هست چون انتظارات شما بالا تر از یک زبان برنامه نویسی است.هر زبانی برای کاربردی ساخته شده و اینطور نیست از هر زبانی همان انتظار را داشت.

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

jblaox
جمعه 30 فروردین 1392, 21:26 عصر
دوست عزیز وقتی شما سوالی رو در تالار سی شارپ مطرح میکنید یعنی اینکه انتظارات شما در چهارچوب سی شارپ هست و جوابی هم که میگیرید خارج از این محیط نیست.در سی شارپ با مفهوم موازی اینطور برخورد میشود و امکانات مشخصی دارد.خواه سودمند و بدون مشکل ، خواه بی کاربرد و مشکل دار.

یک راه حل مناسب تغییر زبان هست چون انتظارات شما بالا تر از یک زبان برنامه نویسی است.هر زبانی برای کاربردی ساخته شده و اینطور نیست از هر زبانی همان انتظار را داشت.

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

سلام مجدد
اول تشکر به خاطر این که وقت گذاشتید پاسخ داید و پیگر هستید .

همانگونه که شما بهتر از من میدانید از نسخه 4 دات نت در C# هم بستر Parallel ایجاد شده است، این بخش جدید است و هنوز در حال توسعه .

باید خدمت شما عرض کنم که در صورت استفاد از Parallel.For متوجه خواهید شد که سیستم عامل کل توان ممکن سخت افزار دردسترس خود را به برنامه میدهد (تمام پردازشگر ها در حداکثر قدرت کار میکنند) اما هرگز و هرگز و هرگز شما نمیتوانید با Thread یک همچین راندمانی دست پیدا کنید، بلکه حداکثر میتوانید یکی از پردازشگر ها را به حداکثر توان برسانید.


این کار را خودتان با یک حلقه ساده بررسی کنید، آن وقت همواره برای کارهای سنگین از Parallel استفاده خواهید کرد.


در مورد اینکه هر زبانی برای کاری است بله 100% موافقم ، به همین علت با چند زبان کار میکنم ، محاسبات عددی از فرترتن! ، ساخت برنامه های ویندوز C# و ....


ارادتمند ...

مبین رنجبر
جمعه 30 فروردین 1392, 21:39 عصر
سلام مجدد
اول تشکر به خاطر این که وقت گذاشتید پاسخ داید و پیگر هستید .

همانگونه که شما بهتر از من میدانید از نسخه 4 دات نت در C# هم بستر Parallel ایجاد شده است، این بخش جدید است و هنوز در حال توسعه .

باید خدمت شما عرض کنم که در صورت استفاد از Parallel.For متوجه خواهید شد که سیستم عامل کل توان ممکن سخت افزار دردسترس خود را به برنامه میدهد (تمام پردازشگر ها در حداکثر قدرت کار میکنند) اما هرگز و هرگز و هرگز شما نمیتوانید با Thread یک همچین راندمانی دست پیدا کنید، بلکه حداکثر میتوانید یکی از پردازشگر ها را به حداکثر توان برسانید.


این کار را خودتان با یک حلقه ساده بررسی کنید، آن وقت همواره برای کارهای سنگین از Parallel استفاده خواهید کرد.


در مورد اینکه هر زبانی برای کاری است بله 100% موافقم ، به همین علت با چند زبان کار میکنم ، محاسبات عددی از فرترتن! ، ساخت برنامه های ویندوز C# و ....


ارادتمند ...

خواهش میکنم.

خوب پس فعلا این امکان جدید هست و از همه جالب تر اینکه امکان Parallel.For از کتابخانه System.Threading هست و در لایه های پایین با آن به صورت Thread رفتار میشود.

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

در آخر بگم ساخت برنامه های ویندوز فقط با سی شارپ میسر نیست و پلتفرم ها و انتخاب های بسیار بهتری در دسترس هست برای این بحث شما.(من Node.js را برای قسمت موازی توصیه میکنم.چون Non-Blocking هست)