草庐IT

多级反馈队列

全部标签

定时器 延迟队列 设计思想

公司有个业务场景:一种典型的应用场景是:小程序(C端)商户发起扣费请求后,立刻为用户下发扣费前通知,24小时后完成扣费;或者发券给用户,3天后通知用户券过期。基于这种需求背景,我们引出了定时器的开发需求。定时器是网络框架中非常重要的组成部分,往往可以利用定时器做一些超时事件的判断或者定时清理任务等。定时器有许多经典高效的实现。最小堆实现定时器双向链表时间轮例如:libevent采用了最小堆实现定时器,redis则结合自己场景直接使用了简单粗暴的双向链表。libco的定时器实现:时间轮,时间轮也是一种非常经典的定时器实现方法。Linux2.6内核之前就采用了多级时间轮作为其低精度定时器的实现。而

c# - 使用默认值初始化队列或堆栈?

您可以使用预置值初始化列表:ListL1=newList{1,2,3};Queue是否有与上述等价的东西?我的想法是:QueueQ1=newQueue{1,2,3};这是行不通的。有什么解决方法吗?是QueueQ1=newQueue();Q1.Enqueue(1);Q1.Enqueue(2);Q1.Enqueue(3);唯一有效的解决方案? 最佳答案 使用构造函数QueueConstructor(IEnumerable)QueueQ1=newQueue(new[]{1,2,3});或者Listlist=newList{1,2,3};

c# - 选择队列中的特定对象(即 peek +1)

如果Peek返回队列中的下一个对象,是否有我可以用来获取特定对象的方法?例如,我想找到队列中的第三个对象并更改其中一个值?现在我只是在队列中执行一个foreach,这可能是最好的解决方案,但我不知道是否有什么特别的东西可以与peek一起使用?即Queue.Peek(2) 最佳答案 如果您想直接访问元素(使用O(1)操作),请使用数组而不是队列,因为队列具有不同的功能(FIFO)。队列上的随机访问操作将是O(n),因为它需要遍历集合中的每个元素......这反过来又使其成为顺序的访问,而不是直接随机访问。然后,由于您使用的是C#,因此

c# - 队列 ForEach 循环抛出 InvalidOperationException

我没用过Queues之前的任何真实程度,所以我可能会遗漏一些明显的东西。我正在尝试遍历Queue像这样(每一帧):foreach(vareinqEnemy){//enemyAIcode}当一个敌人死亡时,敌人用户控件引发一个我订阅的事件,我这样做(队列中的第一个敌人被设计移除):voidEnemy_Killed(objectsender,EventArgse){qEnemy.Dequeue();//AddedTrimExcesstocheckiftheerrorwascausedbyNULLvaluesintheQueue(itwasn't:))qEnemy.TrimExcess();

c# - 如何将 IEumerable 集合添加到队列并在 .NET 中异步处理每个项目?

我已经创建了一个方法来使用交换服务器读取收件箱新消息,如下所示。如何将这些IEnumerable集合添加到队列并异步处理队列中的每个项目列表?privatestaticIEnumerableGetInboxItems(ExchangeServiceservice){varemailInformations=newList();try{SearchFiltersearchFilter=newSearchFilter.SearchFilterCollection(LogicalOperator.And,newSearchFilter.IsEqualTo(EmailMessageSchema

C#任务多队列节流

我需要一个需要维护不同任务队列的环境,并且每个任务队列都有明确定义的并发线程数,可以为每个队列执行。像这样:队列1->3个线程;队列2->6个线程;任务系统的种类。我已经成功地使用普通的旧c#代码(又名System.Threading.Thread、锁和队列)自己实现了这一点,它可以正常工作1年以上。然而,我一直在阅读关于TaskFactory和TaskScheduler的奇迹的文章,关于.NET中内置类的可能性,但我没有找到一个例子来证明这一点。我想测试它并与我现在拥有的进行比较,看看它是否运行得更好,如果运行良好,则更换它。此外,我可以不必限制/设置每个队列的并行线程数,只要我能得

c# - 队列如何与 foreach 循环交互

我真的很惊讶这个问题没有真正的答案。例如,我有一个遍历队列的foreach循环(我使用的是.Net版本)foreach中的队列到底发生了什么?它是否像标准枚举器一样简单地迭代?或者它是否使用Dequeue()功能。为清楚起见:Queueq=newQueue();foreach(intiinq){//whathappensinthisloop?} 最佳答案 Doesitsimplyiterateslikeastandardenumerator?OrdoesitusetheDequeue()它不是迭代队列,而是在其内部数组中通过索引和桶

c# - 堆栈和队列枚举顺序

我知道List枚举器保证枚举顺序并尊重最后的排序操作,我知道Dictionary和HashSet不,即你可以不确定Dictionarydictionary=...;foreach(varpairindictionary){}将按照附加的顺序处理对。Stack和Queue呢?他们的调查员是否保证任何顺序? 最佳答案 对于Stack,枚举目前由一个名为StackEnumerator的嵌套私有(private)类完成(这是来自ReferenceSource):privateclassStackEnumerator:IEnumerator,

c# - 有没有办法获取在 Kestrel/ASP.NET Core 中请求队列中花费的时间?

我的理解是ASP.NETCore中间件在准备好处理请求时运行。但是,如果应用程序处于负载状态并且ASP.NETCore无法处理所有传入的请求,它们会被放入某处的“队列”中吗?我不知道这是否是Kestrel内部的某个托管队列,或者它是否与libuv有关。我想知道给定的请求在这个队列中花费了多长时间。HttpContext上有什么东西可以告诉我这个吗?提前致谢 最佳答案 这题没那么简单。如果你想跟踪所有的时间,你必须做很多步骤。在开始时为请求添加一个独特的戳记或打勾,以便您可以一一识别它们。其次,创建一个处理程序,它会拦截您的请求并记录

c# - Webjobs 会自动续订 Azure 队列消息的租约吗?

当Webjobs通过QueueTrigger从Azure存储上的队列获取消息时,它会租用该消息(使其不可见)。如果(webjob的)触发函数需要很长时间来处理消息,这个租约是否会自动延长?或者我应该在函数中处理它?在这个链接上WindowsAzureQueues:ImprovedLeases,ProgressTracking,andSchedulingofFutureWork,作者声明“执行原始出列的工作人员可以延长消息的租约,以便它可以继续处理消息”注意:我尝试了一个等待20分钟的网络作业(使用QueueTrigger)。//WriteLogThread.Sleep(1200000)