并行处理队列的好策略是什么?

2024-02-13

我正在编写一个程序,需要递归搜索文件夹结构,并且希望与多个线程并行执行此操作。

我已经编写了相当简单的同步方法 - 最初将根目录添加到队列中,然后将目录出队,对其子目录进行排队等,直到队列为空。我会用一个ConcurrentQueue<T> http://msdn.microsoft.com/en-us/library/dd267265.aspx对于我的队列,但已经意识到我的循环将过早停止。第一个线程将使根目录出列,并且立即所有其他线程都可以看到队列为空并退出,使第一个线程成为唯一正在运行的线程。我希望每个线程循环直到队列为空,然后等到另一个线程将更多目录排队,然后继续。我的循环中需要某种检查点,以便在每个线程都到达循环末尾之前,没有任何线程会退出,但我不确定当确实没有更多目录时,在不发生死锁的情况下执行此操作的最佳方法过程。


Use the 任务并行库 http://msdn.microsoft.com/en-us/library/dd460717.aspx.

创建一个Task http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx处理第一个文件夹。在此创建一个Task(递归地)处理每个子文件夹以及每个相关文件的任务。然后等待所有 http://msdn.microsoft.com/en-us/library/dd270695.aspx该文件夹的任务。

TPL 运行时将利用线程池来避免创建线程,这是一项昂贵的操作。对于小件工作。

Note:

  • 如果每个文件的工作量很小,请内联执行,而不是创建另一个任务(IO 性能将是限制因素)。
  • 如果避免阻塞操作,这种方法通常效果最好,但如果 IO 性能是极限,那么这可能并不重要——从简单开始并进行测量。
  • Before .NET 4 much of this can be done with the thread pool, but you'll need to use events http://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx to wait for tasks to complete, and that waiting will tie up thread pool threads.1

1 As I understand it, in the TPL when waiting on tasks—using a TPL method—TPL will reuse that thread for other tasks until the wait is fulfilled.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行处理队列的好策略是什么? 的相关文章

随机推荐