আমি কীভাবে প্যারালালকে সীমাবদ্ধ রাখতে পারি?


295

আমার একটি সমান্তরাল.ফোরএচ () অ্যাসিঙ্ক লুপ রয়েছে যার সাহায্যে আমি কয়েকটি ওয়েব পৃষ্ঠা ডাউনলোড করি। আমার ব্যান্ডউইথটি সীমাবদ্ধ তাই আমি প্রতি মুহূর্তে কেবলমাত্র পৃষ্ঠা পৃষ্ঠা ডাউনলোড করতে পারি তবে সমান্তরাল For ফরচ প্রতিটি পছন্দসই ওয়েবপৃষ্ঠাগুলির পুরো তালিকা সম্পাদন করে।

প্যারালাল.ফোরএচ চালানোর সময় থ্রেড নম্বর বা অন্য কোনও সীমাবদ্ধ করার কি কোনও উপায় আছে?

ডেমো কোড:

Parallel.ForEach(listOfWebpages, webpage => {
  Download(webpage);
});

আসল টাস্কটির ওয়েবপৃষ্ঠাগুলির সাথে কোনও সম্পর্ক নেই, তাই সৃজনশীল ওয়েব ক্রলিং সমাধানগুলি কোনও সাহায্য করবে না।


@jKlaus যদি তালিকাটি সংশোধন না করা হয়, যেমন এটি কেবলমাত্র ইউআরএলগুলির একটি সেট, আমি সত্যিই সমস্যাটি দেখতে পাচ্ছি না?
শিব

@ শিব, পর্যাপ্ত সময় দিলে আপনি যাবেন ... আপনার মৃত্যুদণ্ডের সংখ্যা গণনা করুন এবং এটিকে তালিকার গণনার সাথে তুলনা করুন।
jKlaus

@jKlaus আপনি কি বলছেন যে ভুল হবে?
শিব

1
@jKlaus আপনি একটি নন-থ্রেডস্যাফ উপাদান (পূর্ণসংখ্যা) সংশোধন করছেন। আমি আশা করব যে এটি সেই পরিস্থিতিতে কাজ করবে না। অন্যদিকে ওপি থ্রেডসেফ হওয়া দরকার এমন কোনও কিছু সংশোধন করছে না।
শিব

2
@jKlaus এখানে Parallel.ForEach একটি উদাহরণ যে গণনা সঠিকভাবে সেট করে> আছে dotnetfiddle.net/moqP2C । দুটিই MSDN লিঙ্ক: msdn.microsoft.com/en-us/library/dd997393(v=vs.110).aspx
jhamm

উত্তর:


563

আপনি MaxDegreeOfParallelismএকটি ParallelOptionsপ্যারামিটারে একটি নির্দিষ্ট করতে পারেন :

Parallel.ForEach(
    listOfWebpages,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    webpage => { Download(webpage); }
);

এমএসডিএন: সমান্তরাল

এমএসডিএন: প্যারালালঅ પ્শনস M ম্যাক্সডেগ্রিঅফপ্যারালালিজম


59
এটি এই বিশেষ ক্ষেত্রে প্রযোজ্য নাও হতে পারে তবে আমি বুঝতে পেরেছিলাম যে কেউ যদি এদিকেই আশ্চর্য হয় এবং এটি দরকারী বলে মনে হয় তবে আমি এটিকে ফেলে দেব। এখানে আমি প্রসেসরের গণনার 75% (বৃত্তাকার) ব্যবহার করছি। var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) };
jKlaus

4
ডকুমেন্টেশনে অন্য যে কোনও ব্যক্তিকে এটি সন্ধানের জন্য সংরক্ষণ করতে, এর মান পাস করা -1একে একে নির্দিষ্ট করে না বলার সমান: "যদি [মান] -1 হয়, তবে একই সাথে চলমান ক্রিয়াকলাপগুলির সংখ্যার কোনও সীমা নেই"
স্টুয়ার্ট

এটি আমার কাছে ডকুমেন্টেশন থেকে পরিষ্কার নয় - ম্যাক্সডগ্রিঅফপ্যারালাইজলিকে 4 এ সেট করে (উদাহরণস্বরূপ) লুপের পুনরাবৃত্তির 1/4 তম চলমান 4 টি থ্রেড থাকবে (4 টি থ্রেডের এক রাউন্ড প্রেরণ করা হয়েছে), বা প্রতিটি থ্রেড এখনও একটি লুপ করে? পুনরাবৃত্তি এবং আমরা কেবল কতগুলি সমান্তরালভাবে চালানো সীমাবদ্ধ করছি?
হাশম্যান

7
পরিষ্কার কোর এবং থ্রেড হওয়া একই জিনিস নয়। সিপিইউর উপর নির্ভর করে, কোর প্রতি পৃথক সংখ্যক থ্রেড রয়েছে, সাধারণত প্রতি কোর 2 টি। উদাহরণস্বরূপ, যদি আপনার কাছে কোর প্রতি 2 টি থ্রেড সহ একটি 4 টি সিপিইউ থাকে, তবে আপনার সর্বাধিক 8 টি থ্রেড রয়েছে। @ JKlaus মন্তব্য সামঞ্জস্য করতে var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 2.0)) };। থ্রেড বনাম কোরগুলিতে লিঙ্ক করুন - Askubuntu.com/questions/668538/…
দ্য মিডলম্যান

41

সমান্তরাল থ্রেডগুলির সংখ্যা সীমিত করতে আপনি সমান্তরাল বিভাগ ব্যবহার করতে পারেন এবং ম্যাক্সডগ্রিঅফপ্যারালালিজম সেট করতে পারেন:

Parallel.ForEach(
    listOfwebpages, 
    new ParallelOptions{MaxDegreeOfParallelism=2}, 
    webpage => {Download(webpage);});     

21

এর আরেকটি ওভারলোড ব্যবহার করুন Parallel.Foreachযা একটি ParallelOptionsদৃষ্টান্ত নেয় এবং MaxDegreeOfParallelismকতটা দৃষ্টান্ত সমান্তরালে কার্যকর হবে তা সীমাবদ্ধ করতে সেট করে।


11

এবং VB.net ব্যবহারকারীদের জন্য (বাক্য গঠন অদ্ভুত এবং খুঁজে পাওয়া কঠিন) ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage)
......end sub)  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.