πάν*_*ῥεῖ 7 delphi multithreading threadpool
我正在开发一个程序来从可能很大的目录结构中迁移文件,其中很多都是(大约100万).
我的迁移代码已经运行良好,我正在使用一个类迭代到目录结构,识别文件以一个接一个地顺序迁移它们.
现在,我希望更好地利用目标计算机的可用CPU资源,并进行这些迁移异步从a中获取线程System.Threading.TThreadPool
以执行这些操作.
我非常了解ITask
界面,以及如何使用TTask
设置任务的数组,这些任务将与TThreadPool
实例一起管理.
虽然建立一个大TArray<ITask>
阵列,并等待完成时,所有的目录都走透,只是似乎是不恰当的和低效的方法(尤其是在内存占用方面).
我认为我需要的只是拥有一个简单的线程安全的生产者/消费者队列,当工作线程可用于使用任务并完成它们时,它会增长和缩小.
现在我在Emba文档中发现了一些看起来很有前途的东西,称为a TWorkStealingQueue
,但是通常情况下,文档很差,缺乏如何使用它的简洁示例.
它会归结为类似的东西
TMigrationFileWalker = class(TFileWalker)
strict private
var
FPendingMigrationTasks : TArray<ITask>;
function createMigrationTask(const filename : string) : ITask;
strict protected
procedure onHandleFile(const filename : string); override;
public
procedure walkDirectoryTree(const startDir : string); override;
end;
implementation
procedure TMigrationFileWalker.onHandleFile(const filename : string);
var
migrationTask : ITask;
begin
migrationTask := createMigrationTask(filename);
self.FPendingMigrationTasks := self.FPendingMigrationTasks + [migrationTask];
migrationTask.Start();
end;
procedure walkDirectoryTree(const startDir : string);
begin
inherited walkDirectoryTree(startDir);
TTask.WaitForAll(self.FPendingMigrationTasks,SOME_REASONABLE_TIMEOUT);
end;
Run Code Online (Sandbox Code Playgroud)
当然,我可以拥有一个线程安全的PC队列,并管理一堆线程.但它承诺它适用于线程池,我想利用随之而来的已有的负载平衡机制.
是否有人在这里使用过TWorkStealingQueue
,并且可以给出一个简短的例子,如何在上述情况下使用它?或者至少澄清一下这个课程的实际目的是什么,以防我从命名中完全误解了?
一项研究TWorkStealingQueue
没有产生任何更好的结果,而是重定向到Embarcadero文件不足.
归档时间: |
|
查看次数: |
381 次 |
最近记录: |