我有一个队列(实际上是 3 个不同的队列,但我不相信这会有所作为)。队列包含离散的工作单元。
我有一个QueueManager
产生一个新线程并返回的。新线程查看队列,获取一份工作,然后生成一个新线程来处理它。
我显然希望限制并发线程的数量,并且看不到有任何理由在完成工作后不重用线程。
有些作业需要一段时间才能运行(几分钟/几小时),我已经读到这ThreadPool
对于需要几秒钟以上的任何事情来说都不是一个好的选择。
实际上,我想实现 ThreadPool 但有更多控制权。
那么......实现这一目标的标准、最佳实践方法是什么?
看来我需要(假设队列长度 > MaxThreadCount
)
- 创造新的工作,直到我击中
MaxThreadCount
- 等到任何线程完成
- 从队列中获取下一个作业并将其分配给线程
- 重复
- 如果队列为空,则休眠一段时间,然后重新检查
(在这种情况下,队列在数据库中,因此添加项目时没有事件 - 我假设我只需要轮询)
许多工作涉及从远程站点/API 检索页面,通常是重复的。因此,我相信我会受益于拥有比核心多得多的线程(因为它们中的大多数将等待网络)。因此,我认为 WaitHandle
不合适,因为它有 64 线程的限制。
这显然是一种非常常见的模式,所以我认为必须有一种成熟的方式来实现它?
如果有人能给我举一个很好的例子,那就太好了。