OTL 的重复调用次数限制 Parallel.ForEach
Limitation in the number of repeated calls for OTL's Parallel.ForEach
我开始使用 OTL 进行多线程处理,并得到了很大的帮助!
各种使用Parallel.ForEach
都成功了。但是现在遇到了一起莫名其妙的案子
请看下面简单完整的代码:
program test;
{$APPTYPE CONSOLE}
uses
OtlParallel;
var
i: integer;
begin
for i := 1 to 1251 do
Parallel.ForEach(0, 0).Execute(
procedure (const num: integer)
begin
end);
end.
当迭代次数超过1250时,出现错误:
'System Error. Code: 1816. Not enough quota is available to process this command'.
我会不会误解了 OTL 的任何基本用法?
这个问题是由 OTL 内部的一些(可能有问题的)设计解决方案引起的,目前无法解决(除非在主线程中处理消息,正如其他人所说)。
无论如何,我建议您进一步重构您的方法。例如,您可以创建一个只有一个并行工作器的 BackgroundWorker 抽象,然后创建 2000 个工作项并将它们发送到 BackgroundWorker。在后台工作人员的 Execute 方法中,您可以使用 Parallel.ForEach 来处理任务。
或者您可以创建一个具有多个并行任务(= 核心数)的 BackgroundWorker,然后 运行 在每个任务中创建一个普通的 for 循环。这可能会给你最快的性能。
顺便说一句,如果您使用 Parallel.ForEach 的简单形式,那么新的 Parallel.&For 会表现得更好。它没有 ForEach 的所有功能,但速度要快得多。
我开始使用 OTL 进行多线程处理,并得到了很大的帮助!
各种使用Parallel.ForEach
都成功了。但是现在遇到了一起莫名其妙的案子
请看下面简单完整的代码:
program test;
{$APPTYPE CONSOLE}
uses
OtlParallel;
var
i: integer;
begin
for i := 1 to 1251 do
Parallel.ForEach(0, 0).Execute(
procedure (const num: integer)
begin
end);
end.
当迭代次数超过1250时,出现错误:
'System Error. Code: 1816. Not enough quota is available to process this command'.
我会不会误解了 OTL 的任何基本用法?
这个问题是由 OTL 内部的一些(可能有问题的)设计解决方案引起的,目前无法解决(除非在主线程中处理消息,正如其他人所说)。
无论如何,我建议您进一步重构您的方法。例如,您可以创建一个只有一个并行工作器的 BackgroundWorker 抽象,然后创建 2000 个工作项并将它们发送到 BackgroundWorker。在后台工作人员的 Execute 方法中,您可以使用 Parallel.ForEach 来处理任务。
或者您可以创建一个具有多个并行任务(= 核心数)的 BackgroundWorker,然后 运行 在每个任务中创建一个普通的 for 循环。这可能会给你最快的性能。
顺便说一句,如果您使用 Parallel.ForEach 的简单形式,那么新的 Parallel.&For 会表现得更好。它没有 ForEach 的所有功能,但速度要快得多。