【问题标题】:Best way to limit threads to a DBs while allowing a larger max thread将线程限制为数据库的最佳方法,同时允许更大的最大线程
【发布时间】:2019-03-14 17:49:52
【问题描述】:

对 C# 相当陌生。我有 12 个 Oracle 数据库,每个数据库大约有 10000 多个模式。 我想在每个模式中运行一个多线程进程(比如查询或脚本)。

如果我:ThreadPool.SetMaxThreads(100,<not really sure what to put here>),我很可能会立即使用 100 个连接访问 DB1。

我想一次将负载分散到每个 DB 最多 10 个线程/连接,但总体上可能有 100 个运行。我知道我不能拥有 ThreadPool1、Threadpool2 等。

最好的处理方法是什么?

任何见解表示赞赏! --谢谢!

【问题讨论】:

  • ThreadPool 中的线程数并不决定您正在执行多少并发工作。为什么不为每个数据库创建一个类,然后处理那里使用的并发连接数?
  • @Zer0 - 这可能是我的问题的根源。我不知道如何限制线程池之外的线程。什么可以防止 DB1 级烧毁分配?当我继续搜索时,我确实找到了这个(我现在正在阅读:)albahari.com/threading/#_Thread_Pooling也许我很快就会在这里有更好的理解。感谢您的回复!

标签: c# multithreading oracle threadpool


【解决方案1】:

如果您松散地“启动” 100 个线程,那么对 ThreadPool 的设置将导致 100 个连接,并且这些线程几乎会立即开始针对您的数据库工作。

限制工作的并行线程数量的一种方法是使用 Parallel.ForEach 或 Parallel.For,因为它们提供了 ParallelOptions 参数,您可以在其中设置最大并行度:

Parallel.ForEach<string>(rows, new ParallelOptions() { MaxDegreeOfParallelism = batchSize},(row) => { 
     // your code here 
 } );

Parallel.For(0,100, new ParallelOptions() { MaxDegreeOfParallelism = batchSize }, i => { 
    //your code here 
});

MaxDegreeOfParallelism 会将并发工作限制为 batchSize 值,等待批处理完成后再开始新的批处理直到完成。

【讨论】:

  • HRmm.. 我会进一步研究这个。这可能会减慢它的速度吗?如果 10 个中的一个很大,那么该批次会等到所有 10 个都完成后再抓取下一批吗?谢谢!
  • 是的,直到完整的批次没有完成你不会开始一个新的,就像手动创建 10 个任务并在创建另外 10 个之前使用 WaitAll 完成所有任务。
猜你喜欢
  • 2011-04-01
  • 2012-02-17
  • 2018-08-04
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2020-10-12
  • 2020-04-09
  • 1970-01-01
相关资源
最近更新 更多