Design patterns 领导者/追随者与工作队列

Design patterns 领导者/追随者与工作队列,design-patterns,queue,scalability,parallel-processing,Design Patterns,Queue,Scalability,Parallel Processing,我刚刚读了一篇关于的文章,如果我理解正确,我将我的工作人员放在队列中,第一个工作人员接收传入的请求并从队列中分离 对于正常的工作队列(例如,情况正好相反):我将我的作业保留在队列中,一旦工作人员完成处理,它就从队列中取出第一个作业 有什么我遗漏的吗 那么,我应该使用领导者/追随者方法而不是工作队列有哪些优点?或者反过来说,在什么情况下工作队列更适合 再见, Nico领导者/追随者是关于有效处理多个员工的。当你没有工作时,你的工人在做什么?一种常见的、简单的方法是让单个使用者线程通过生成线程或使用

我刚刚读了一篇关于的文章,如果我理解正确,我将我的工作人员放在队列中,第一个工作人员接收传入的请求并从队列中分离

对于正常的工作队列(例如,情况正好相反):我将我的作业保留在队列中,一旦工作人员完成处理,它就从队列中取出第一个作业

有什么我遗漏的吗

那么,我应该使用领导者/追随者方法而不是工作队列有哪些优点?或者反过来说,在什么情况下工作队列更适合

再见,
Nico

领导者/追随者是关于有效处理多个员工的。当你没有工作时,你的工人在做什么?一种常见的、简单的方法是让单个使用者线程通过生成线程或使用线程池将作业分派给工作线程。讨论的模式提供了一种替代方法,通过让获取作业的(领导)线程执行工作任务本身,避免了调度器和工作线程之间的同步。它将等待的工作人员提升到领导位置,以保持系统响应

请注意,本文讨论的是等待工作的低级机制,这些机制(很容易)不支持多个线程在同一工作“队列”上等待。更高级别的构造(如消息队列)支持多个工作线程,所有工作线程都在同一个源(即竞争消费者)上执行阻塞读取,但可能无法获得所述的相同好处。抽象级别越高,编程就越容易,但通常是以从较低级别的方法中获得的性能为代价的

EDIT1:

这是一个虚构的示例(仅限伪代码)。请注意,我没有写这篇文章,也没有对它进行基准测试,因此我无法真正谈论其中一个与另一个的性能。但希望这能显示出风格上的差异

// in QueueHandler processing loop

while(true)
{
   // read, blocking until one arrives
   Request req = requestQueue.BlockingRead();

   // we have a unit of work now but the QueueHandler should not process it
   //  because if it is long running then no new requests can be handled.
   //  so we spawn / dispatch to a thread
   ThreadPool.QueueWorkItem(req);
   // or new Thread(DoWork(), req).Start;

   // at this point we know that the request will get picked up in 
   // an unknown but hopefully very short amount of time by a 
   // waiting (sleeping/blocking) or new thread and it will get passed the 
   // work.  But doing so required the use of thread synchronization 
   // primitives that can cause all processors to flush their caches 
   // and other expensive stuff.


} // now loop back up to read the next request
VS


首先,对于工作队列,您需要锁定工作队列。 第二,这是主要问题, 对于工作队列,您必须唤醒一个工作线程,该线程在系统任务调度器实际运行任务之前不会处理该工作。 当您使用不同的处理器内核处理工作项时,比使用填充队列的处理器内核处理工作项更糟糕。
因此,您可以使用引导-跟随模式实现更低的延迟。

不同之处在于,这种低级方法不会阻塞,因此执行速度更快?它具有更少的争用,线程之间的工作传递更少。协调线程通信/同步通常需要使用锁等,这对许多处理器上运行的代码有非常负面的影响。但是,您能否指出这与工作队列之间的具体区别?我仍然不明白为什么工作队列需要更多的锁定。无论哪种方式,都有某种类型的工作队列,这种模式是关于管理工人的。我将用一些psuedo代码编辑我的帖子。
// in Leader

while(true)
{

   // I'm the leader, blocking read until a request arrives
   Request req = queue.BlockingRead();

   // We have a unit of work and we are going to process it ourselves.  
   // But first we notify a follower.
   Followers.PromoteOne();

   // work on the request in this thread!
   DoWorkOn(req);

   // now that I'm done, wait to the the leader
   Followers.BlockingWaitToBeLeader();

}