我在 C# 程序中有以下 PLINQ 语句:
foreach (ArrestRecord arrest in
from row in arrestQueue.AsParallel()
select row)
{
Geocoder geocodeThis = new Geocoder(arrest);
writeQueue.Enqueue(geocodeThis.Geocode());
Console.Out.WriteLine("Enqueued " + ++k);
}
两者都是ConcurrentQueues。arrestQueue
_writeQueue
没有并行运行:
- 运行时,总 CPU 使用率约为 30%,这也是所有其他运行的情况。我有 8 个内核(具有 4 个物理内核的 Core i7 720QM 上的超线程),8 个内核中有 4 个几乎没有任何利用率。其余的运行大约 40%-50%。
- 磁盘使用率通常为 0%,除了查询本地主机上的 Postgres 数据库外,没有网络使用情况(见下文)。
- 如果我在内部某处添加断点
geocodeThis.Geocode()
,Visual Studio 的Thread下拉列表只会显示[ pid ] Main Thread。它永远不会进入任何其他线程。 - 我正在使用Npgsql连接到 Postgres,并且每个线程对一个表运行一些SELECT查询。我正在运行 pgAdmin III 的服务器状态应用程序,它显示pg_stat_activity。通过监控这一点,以及战略断点放置(见上文),我可以看到应用程序永远不会为所有假定的并发线程打开超过 1 个数据库连接
geocodeThis.Geocode()
。即使我将Pooling=false添加到数据库连接字符串中,以强制连接不被池化,我也从未看到超过 1 个连接在geocodeThis.Geocode()
. - Postgres 表在WHERE子句中的每一列上都有索引。即使它的索引很差,我也希望有大量的磁盘使用。如果 Postgres 以任何其他方式支撑事情,似乎它会吸收核心。
这似乎是一个简单的 PLINQ 案例研究,我正在为为什么没有并行运行而摸不着头脑。