在对象集合上执行相同功能的最有效方法是什么,每个对象并行运行?我知道我可以在循环中做#!/usr/bin/perl
use utf8;
use strict;
use warnings 'all';
use open qw/ :std :encoding(utf-8) /;
use autodie;
use Text::CSV;
my $csv = Text::CSV->new({ binary => 1, sep_char => ';' });
open my $fh, '<', 'test.csv';
while ( my $row = $csv->getline($fh) ) {
print "@$row\n";
}
close $fh;
但是有更好的方法吗?这似乎是一种非常难看的做法。
答案 0 :(得分:8)
[...]有更好的方法吗?这似乎是一种非常难看的做法。
是的,这是一种非常丑陋且低效的方式。每个线程将消耗大量资源,但您的计算机只能在N是计算机上的CPU核心数的同时执行N个线程。因此,不是像线程那样使用低级原语,而是可以在库之上构建,以优化线程数以适应CPU核心数。
如果您有一组对象,我建议:
LINQ代码:
var result = source.Select(item => ...).ToList();
并行LINQ代码:
var result = source.AsParallel().Select(item => ...).ToList();
对于每个循环:
foreach (var item in source)
Process(item);
每个循环并行:
Parallel.ForEach(
source,
item => Process(item);
);
For loop:
for (var i = 0; i < list.Count; i += 1)
list[i] = Process(list[i]);
并行循环:
Parallel.For(
0,
list.Count,
i => {
list[i] = Process(list[i]);
}
);
答案 1 :(得分:2)
您可以从.net 4.0开始使用Parallel.For
或Parallel.Foreach
或Parallel.Invoke
。
从.Net4.0开始,很少有理由直接在代码中使用Thread
。您可以使用TPL,这是实现任务并行或数据并行的推荐方法。
只要您输入
new Thread()
,它就会结束;你的项目已经有了 遗留代码