求一个好的鸭梨统计方法.

ChrisAK 2011-09-27 10:43:44
这两天重写了代码丢失的线程库里的线程池;顺便想加上根据鸭梨来确定线程池内应保留多少线程.

以前的方法是:
--------------------------
线程池设一个下限值min和上限值max;
min为线程中最小常驻线程数.也就是说即使线程池当前没有任何事可干,仍然保留min个线程在池中备用.
max为线程上限,当有任务排入线程池准备处理而池中线程都为忙时, 最多可以扩充线程池中的线程数到max.

当一个任务完成后,线程会先查看队列里是否有任务可做,如果没有则检查当前线程数tc是否>min是的话则自
行销毁.

--------------------------

现在我想根据实际的请求繁忙程度来调整池中线程的数量.具体就是当一个线程完成任务检查没有任务可做
后,它应该怎么判断自己是否应该自行销毁呢?

自己想了好几种方法.比如单位时间内任务排入数,空闲线程与任务数之比之类的.感觉都不太合理.我对数学
统计啥的实在是头大.求一个好的方案.
...全文
162 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
专心做码农 2011-09-27
  • 打赏
  • 举报
回复

数学早还给数学老师了
坐等高手
shihaojie1219 2011-09-27
  • 打赏
  • 举报
回复
学习,帮顶~~
cangkukuaimanle 2011-09-27
  • 打赏
  • 举报
回复
不知道lz什么意思,线程池指定了min和max后,自己执行任务后自行判断然后自己处理的,不需要你考虑的。如果你想模拟下线程池,那你得定义一个线程数组或者List<Thread>线程列表,然后自己制定个规则来决定是增加线程量还是减少。例如:有50个任务Task[]tasks=new Task[50],你定义的List<Thread> threads=new List<Thread>();通过threads.Add(new Thread())方法加20个线程进去初始化。那么最开始的那个完成任务时发现还有49个任务,可以往threads.Add(new Thread())添加线程,具体添加多少个由定义的规则自己决定,当某个线程完成任务时发现任务只有25任务,而当前threads里有26个线程时,就可以threads.Remove()来去掉此线程,当然得把这个县城先释放掉。。。。。。
chuanzhang5687 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ordimega 的回复:]

友情帮顶,楼主记得给分





急缺分数








友情帮顶







急缺分数
[/Quote]
ordimega 2011-09-27
  • 打赏
  • 举报
回复
友情帮顶,楼主记得给分




急缺分数








友情帮顶







急缺分数
绿色夹克衫 2011-09-27
  • 打赏
  • 举报
回复
也许不需要搞得太复杂,取不到任务就销毁,我觉得挺好的。
jimh 2011-09-27
  • 打赏
  • 举报
回复
首先,猜测一下几点:
1,每个线程会占用一定的资源,所以线程有上限。
2,每个线程创建销毁都会消耗资源(CPU时间),所以应该尽量重用线程,避免频繁创建新线程,所以在资源允许的情况下,保留几个线程,可以加快响应速度。
3,上限是不可调整的,这是硬件资源的限制,所以Max永远存在。
4,下限可以调整,保留多少个线程,需要一个算法。

如果成立才有下一步:
1,保留空闲的线程数,是为了避免频繁创建销毁线程,如果这台是服务器,那没必要销毁,直接就是最大线程数就可以,不需要释放任何线程,这样效率最高。
2,无法根据队列长度来决定是否释放线程,因为主要队列还有,那线程就会接着干,只有队列空了,才会考虑释放线程的问题。
3,可以使用预测,预测相关参数:线程处理每个任务的平均时间,任务平均到达时间(就是我们空线程的处理能力了),定义目标:空闲的线程数应该能满足处理一定时间内到达的任务而不用创建新线程。
4,说的够明白了,按这个思路去设计算法吧。
Dotar 2011-09-27
  • 打赏
  • 举报
回复
路过!!帮顶!!!!
Herbert 2011-09-27
  • 打赏
  • 举报
回复

设置一个比例p和一个最小预留数n

if(空闲线程数/总线程数>p && 空闲线程数>n)
{
// 销毁
}

例如 p=20% n=5

具体数值p要根据波动规律来设置,n为固定值

我们的目的应该是尽量少地开新线程

假如时间范围△t是可以容忍开新线程的临界时间,min为在这个时间内工作线程数最小值,max为

最大值

那么,p ≈ (max-min)/max
种草德鲁伊 2011-09-27
  • 打赏
  • 举报
回复
yojinlin 2011-09-27
  • 打赏
  • 举报
回复
路過。
MadEric 2011-09-27
  • 打赏
  • 举报
回复
考虑 当前任务数/空闲线程数 与 单位时间任务数的增加趋势,给两者合适的权重,计算总得加权值。设定一个阈值,根据加权值与阈值的比较来确定是否自行销毁。 权重和阈值的这顶需要根据实际情况进行试验,根据实际效果来确定。
litianci2002 2011-09-27
  • 打赏
  • 举报
回复
路过。。。
h_zai888 2011-09-27
  • 打赏
  • 举报
回复
你可以设置一个线程完成多少次后销毁或者多长时间后销毁
M_juaner 2011-09-27
  • 打赏
  • 举报
回复
没有用过的人帮顶!

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧