나는 약간 혼란스러워한다 Parallel.ForEach
.
무엇이며 Parallel.ForEach
정확히 무엇을합니까?
MSDN 링크를 참조하지 마십시오.
다음은 간단한 예입니다.
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
foreach (string line in list_lines)
{
//My Stuff
}
이 예제를 Parallel.ForEach
어떻게 다시 작성할 수 있습니까?
답변
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
List<string> list_lines = new List<string>(lines);
Parallel.ForEach(list_lines, line =>
{
//Your stuff
});
답변
Foreach 루프 :
- 반복은 하나씩 순차적으로 수행됩니다.
- foreach 루프는 단일 스레드에서 실행됩니다.
- foreach 루프는 .NET의 모든 프레임 워크에서 정의됩니다.
- 느리게 실행되는 프로세스는 순차적으로 실행
되므로 느려질 수 있습니다.
- 프로세스 2는 1이 완료 될 때까지 시작할 수 없습니다. 프로세스 3은 2 & 1이 완료 될 때까지 시작할 수 없습니다 …
- 스레딩 오버 헤드가 없으므로 빠른 프로세스 실행이 더 빨라질 수 있습니다.
Parallel.ForEach :
- 실행은 병렬로 수행됩니다.
- Parallel.ForEach는 여러 스레드를 사용합니다.
- Parallel.ForEach는 .Net 4.0 이상 프레임 워크에서 정의됩니다.
- 의 실행 속도가 느린 프로세스가 될 수 있습니다 빨리 그들이 병렬로 실행할 수있는,
- 프로세스 1, 2 및 3 이 동시에 실행될 수 있습니다 (아래 예에서 재사용 된 스레드 참조).
- 추가 스레딩 오버 헤드로 인해 빠른 프로세스 실행이 느려질 수 있습니다.
다음 예제는 전통적인 foreach 루프와
Parallel.ForEach () 예제
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ParallelForEachExample
{
class Program
{
static void Main()
{
string[] colors = {
"1. Red",
"2. Green",
"3. Blue",
"4. Yellow",
"5. White",
"6. Black",
"7. Violet",
"8. Brown",
"9. Orange",
"10. Pink"
};
Console.WriteLine("Traditional foreach loop\n");
//start the stopwatch for "for" loop
var sw = Stopwatch.StartNew();
foreach (string color in colors)
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
Console.WriteLine("foreach loop execution time = {0} seconds\n", sw.Elapsed.TotalSeconds);
Console.WriteLine("Using Parallel.ForEach");
//start the stopwatch for "Parallel.ForEach"
sw = Stopwatch.StartNew();
Parallel.ForEach(colors, color =>
{
Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}
);
Console.WriteLine("Parallel.ForEach() execution time = {0} seconds", sw.Elapsed.TotalSeconds);
Console.Read();
}
}
}
산출
Traditional foreach loop
1. Red, Thread Id= 10
2. Green, Thread Id= 10
3. Blue, Thread Id= 10
4. Yellow, Thread Id= 10
5. White, Thread Id= 10
6. Black, Thread Id= 10
7. Violet, Thread Id= 10
8. Brown, Thread Id= 10
9. Orange, Thread Id= 10
10. Pink, Thread Id= 10
foreach loop execution time = 0.1054376 seconds
Parallel.ForEach 예제 사용
1. Red, Thread Id= 10
3. Blue, Thread Id= 11
4. Yellow, Thread Id= 11
2. Green, Thread Id= 10
5. White, Thread Id= 12
7. Violet, Thread Id= 14
9. Orange, Thread Id= 13
6. Black, Thread Id= 11
8. Brown, Thread Id= 10
10. Pink, Thread Id= 12
Parallel.ForEach() execution time = 0.055976 seconds
답변
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
// No need for the list
// List<string> list_lines = new List<string>(lines);
Parallel.ForEach(lines, line =>
{
//My Stuff
});
이렇게하면 루프 내에서 행이 병렬로 구문 분석됩니다. Parallel 클래스에 대한보다 자세하고 “참조 지향적 인”소개를 원한다면 Parallel.ForEach 섹션 을 포함하는 시리즈를 TPL에 작성했습니다 .
답변
큰 파일의 경우 다음 코드를 사용하십시오 (메모리가 부족합니다)
Parallel.ForEach(File.ReadLines(txtProxyListPath.Text), line => {
//Your stuff
});
답변
이 라인은 나를 위해 일했습니다.
string[] lines = File.ReadAllLines(txtProxyListPath.Text);
var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 10 };
Parallel.ForEach(lines , options, (item) =>
{
//My Stuff
});