PLINQ - WithDegreeOfParallelism
-
WithDegreeOfParallelism: Degree of parallelism is the maximum number of concurrently executing tasks that will be used to process the query. I don't quite understand what you mean by this sentence. --> "concurrently executing tasks" What exactly is meant by "TASK"? CPU or Kernel or something else??? What does "3" do in the code block below; AdventureWorks2017Context context = new AdventureWorks2017Context(); context.Products.AsParallel().WithDegreeOfParallelism(3).ForAll(p => { //ToDO }) Best Regards...
-
WithDegreeOfParallelism: Degree of parallelism is the maximum number of concurrently executing tasks that will be used to process the query. I don't quite understand what you mean by this sentence. --> "concurrently executing tasks" What exactly is meant by "TASK"? CPU or Kernel or something else??? What does "3" do in the code block below; AdventureWorks2017Context context = new AdventureWorks2017Context(); context.Products.AsParallel().WithDegreeOfParallelism(3).ForAll(p => { //ToDO }) Best Regards...
dataminers wrote:
what you mean by this sentence. --> "concurrently executing tasks"
The term tasks in that context is equivalent to threads in your previous question. LINQ will create multiple threads and share the problem between them.
dataminers wrote:
What does "3" do in the code block below;
It's the value referred to in your first sentence.
-
dataminers wrote:
what you mean by this sentence. --> "concurrently executing tasks"
The term tasks in that context is equivalent to threads in your previous question. LINQ will create multiple threads and share the problem between them.
dataminers wrote:
What does "3" do in the code block below;
It's the value referred to in your first sentence.
Dear Richard, thank you for your reply. I understand that based on your answer, the two code blocks below are the same;
await Task.Run(() =>
{
CalculateSomething(5);
});await Task.Run(() =>
{
CalculateSomething(8);
});List myList = new() { 5, 8 };
myList.AsParallel().WithDegreeOfParallelism(2).ForAll(x =>
{
CalculateSomething(x);
});Both complete the process on two Threads. Note: CalculateSomething hypothetically this function takes a very long time Regards...
-
Dear Richard, thank you for your reply. I understand that based on your answer, the two code blocks below are the same;
await Task.Run(() =>
{
CalculateSomething(5);
});await Task.Run(() =>
{
CalculateSomething(8);
});List myList = new() { 5, 8 };
myList.AsParallel().WithDegreeOfParallelism(2).ForAll(x =>
{
CalculateSomething(x);
});Both complete the process on two Threads. Note: CalculateSomething hypothetically this function takes a very long time Regards...
-
Sometimes people get confused when you read a lot. You know, not all information on the Internet is correct. That's why I'm investigating the issue. Please don't get me wrong. Multi-Thread: Running more than one Threads inside a Process. Parallel Programming: Running threads simultaneously on different cores in multi-core processors. So; .NET Core TPL (Task Parallel Library) is Multi-Thread programming, not a Parallel Programming. Isn't it?
-
Sometimes people get confused when you read a lot. You know, not all information on the Internet is correct. That's why I'm investigating the issue. Please don't get me wrong. Multi-Thread: Running more than one Threads inside a Process. Parallel Programming: Running threads simultaneously on different cores in multi-core processors. So; .NET Core TPL (Task Parallel Library) is Multi-Thread programming, not a Parallel Programming. Isn't it?
Your definitions are not correct. You can also have multiple physical CPUs with multiple cores each. Threads refers to "threads of execution". You can have multiple threads running on a single core, though the core will only execute code on one thread at a time, for a limited amount of time before switching to the next thread in the scheduler. You can have multiple cores running multiple threads at the same time. You can have more threads "running" than there are cores in the CPUs to run them. For example, open Task Manager and go to the Performance tab. See the "Threads" number? There's thousands of threads running in hundreds of processes, but you only have, say, 8 cores to run them all. Most threads are sitting idle, waiting for a core to execute them, or waiting for I/O to complete, or whatever else. Windows gives the illusion of running thousands of threads using "pre-emptive multitasking". This allows a thread to execute on a core for a small amount of time before being stopped and the core switches to the next thread in the scheduler. A Task is NOT a thread. In some respects, it looks like a thread of execution, but it's really an abstraction, or wrapper around a block of work to do. Tasks are scheduled to run on a pool of threads (a ThreadPool). You can have more tasks running than there are threads in the pool. Tasks can sit idle waiting for an available thread to a task, or part of a task. A single task can be executed by multiple threads. Thread0 can execute a task for a limited time, then the task is idled, waiting for execution to be resumed by either another thread, or the same thread that was executing it before. Thread1 can pick up where Thread0 left off, or Thread0 can come back around and pick up where it left off. Think of it as layers, with CPUs at the bottom of the stack, cores on top of that, then threads on top of cores, and Tasks on top of threads. Each layer you go higher in the stack can have more items in it than the layer below.
|+++++++ Tasks +++++++|
|++++ Threads ++++|
|+++ Cores +++|
|+ CPUs + |Parallel programming is a technique, or library, that makes it easier to write code to execute on multiple threads, or cores, to accomplish work. The Task Parallel Library is an IMPLEMENTATION of parallel programming. The TPL makes it easier to write code that uses multiple threads to accomplish work.
Asking questions is a skill[](</x-turndown)
-
Dear Richard, thank you for your reply. I understand that based on your answer, the two code blocks below are the same;
await Task.Run(() =>
{
CalculateSomething(5);
});await Task.Run(() =>
{
CalculateSomething(8);
});List myList = new() { 5, 8 };
myList.AsParallel().WithDegreeOfParallelism(2).ForAll(x =>
{
CalculateSomething(x);
});Both complete the process on two Threads. Note: CalculateSomething hypothetically this function takes a very long time Regards...
dataminers wrote:
the two code blocks below are the same
No they're not. The first one starts a new task to execute
CalculateSomething(5)
, and then suspends the current thread until that task completes. It then starts another task to executeCalculateSomething(8)
. The second one starts two tasks to executeCalculateSomething(5)
andCalculateSomething(8)
, and then freezes the current thread until both have completed. If you time both approaches, theAsParallel
code will be roughly twice as fast as the twoawait Task.Run(...)
calls. The closest equivalent usingTask.Run
would be:// Start both tasks in parallel:
Task t1 = Task.Run(() => CalculateSomething(5));
Task t2 = Task.Run(() => CalculateSomething(8));// Wait for both tasks to complete:
await Task.WhenAll(t1, t2);
// Or: await t1; await t2;
"These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer