当任务执行队列非常大时,策略可能是什么?
What may be strategy when Queue of task execution very big?
我有 ConcurrentQueue TasksCollection
个,其中包含 ITask
个对象。不是.Net框架的Task
class
public class TaskRunner:IDisposable
{
private Task _orderTask;
public TaskRunner()
{
TasksCollection = new ConcurrentQueue<ITask>();
}
public void Start()
{
_needToStopOrderTask = false;
_orderTask = Task.Factory.StartNew(() => OrderTaskLoop());
}
public void Stop()
{
lock(_lockObject)
_needToStopOrderTask = true;
}
}
因此,当某些事件发生时,我会创建 ITask
并添加到 ConcurrentQueue
新任务。
在线程循环中,我得到每个任务并执行它(同步和一致地执行一些代码。看来,我不能并发它。
private void OrderTaskLoop()
{
try
{
if (TasksCollection.Count == 0)
return;
while (!_needToStopOrderTask)
{
if(TasksCollection.Count>100)//too many tasks
{
//what should i do here?
}
ITask task = null;
var tryTake = TasksCollection.TryDequeue(out task);
///execute
}
}
}
所以,在我的情况下,我认为我可以清理队列并继续工作,因为我的跑步者在实时环境中工作。但是,可能存在这种情况的某种模式吗?
ConcurrentQueue
计数太大怎么办?
谢谢!
实际上,一旦任务到达的速度快于它们的处理速度,我可以建议以下几个选项:
忽略一些任务。
a) 例如停止添加新任务(如@Mikael Nitell 在评论中建议)。
b) 或者只是清理队列(就像你自己建议的那样)
c) 引入任务超时。任务可能会在超时时被删除。可以为不同类型的任务使用不同的超时。如果这适合你。
更快地处理任务以避免队列长度变长。
a) 查看任务处理并找到减少处理时间的方法。
b) 找到如何 运行 并行处理任务的方法。如果任务不能完全并行,它们可能可以部分并行。
如果事件负载不规则,则可能允许更大的队列长度。
当事件密集到达时 - 正在收集任务并且队列长度正在增加。
当事件未到达或到达缓慢时 - 队列长度正在减少,因为任务的处理速度比它们到达的速度快。
最合适的选择取决于具体情况和项目需要。
也可以考虑这些选项的组合。
我有 ConcurrentQueue TasksCollection
个,其中包含 ITask
个对象。不是.Net框架的Task
class
public class TaskRunner:IDisposable
{
private Task _orderTask;
public TaskRunner()
{
TasksCollection = new ConcurrentQueue<ITask>();
}
public void Start()
{
_needToStopOrderTask = false;
_orderTask = Task.Factory.StartNew(() => OrderTaskLoop());
}
public void Stop()
{
lock(_lockObject)
_needToStopOrderTask = true;
}
}
因此,当某些事件发生时,我会创建 ITask
并添加到 ConcurrentQueue
新任务。
在线程循环中,我得到每个任务并执行它(同步和一致地执行一些代码。看来,我不能并发它。
private void OrderTaskLoop()
{
try
{
if (TasksCollection.Count == 0)
return;
while (!_needToStopOrderTask)
{
if(TasksCollection.Count>100)//too many tasks
{
//what should i do here?
}
ITask task = null;
var tryTake = TasksCollection.TryDequeue(out task);
///execute
}
}
}
所以,在我的情况下,我认为我可以清理队列并继续工作,因为我的跑步者在实时环境中工作。但是,可能存在这种情况的某种模式吗?
ConcurrentQueue
计数太大怎么办?
谢谢!
实际上,一旦任务到达的速度快于它们的处理速度,我可以建议以下几个选项:
忽略一些任务。
a) 例如停止添加新任务(如@Mikael Nitell 在评论中建议)。
b) 或者只是清理队列(就像你自己建议的那样)
c) 引入任务超时。任务可能会在超时时被删除。可以为不同类型的任务使用不同的超时。如果这适合你。更快地处理任务以避免队列长度变长。
a) 查看任务处理并找到减少处理时间的方法。
b) 找到如何 运行 并行处理任务的方法。如果任务不能完全并行,它们可能可以部分并行。如果事件负载不规则,则可能允许更大的队列长度。
当事件密集到达时 - 正在收集任务并且队列长度正在增加。
当事件未到达或到达缓慢时 - 队列长度正在减少,因为任务的处理速度比它们到达的速度快。
最合适的选择取决于具体情况和项目需要。
也可以考虑这些选项的组合。