什么时候应该使用队列?

时间:2012-06-24 23:09:53

标签: networking network-programming

假设我们要实现一个网络应用程序,例如与中央服务器和几个客户端的聊天:我们假设所有通信都必须通过中央服务器,然后它应该从一些客户端获取消息并将它们转发到目标客户等等。

无论使用何种技术(套接字,Web服务等),都可以认为有一些生产者线程(生成消息)和一些消费者线程< / em>(读取消息)。

例如,您可以将单个队列用于传入和传出消息,但是使用单个队列时,您无法同时接收和发送消息,因为一次只有一个线程可以访问该队列。

使用两个队列可能更合适:例如,this article解释了一种管理双队列的方式,以便生产者和消费者几乎可以同时工作。如果只有生产者和消费者,但是如果有许多客户端,则这种情况可能没有问题:

  • 如何让中央服务器同时从多个输入流接收数据?
  • 如何让中央服务器同时向多个输出流发送数据?

要解决此问题,我的想法是为每个客户端使用一个双重队列:在中央服务器上,每个客户端连接可能与两个队列相关联,一个用于来自该客户端的传入消息,另一个用于传递给该客户端的消息。客户。通过这种方式,中央服务器可以在几乎所有与客户端的连接上同时发送和接收数据......

可能有其他方法来管理队列......有哪些参数可以确定需要多少队列以及如何组织它们?有些情况下不需要任何队列吗?

1 个答案:

答案 0 :(得分:1)

对我而言,每个客户端使用队列或每个客户端使用多个队列的想法似乎忽略了这一点。首先,绝对有可能建立一个可以由2个线程同时访问的队列(一个可以将一个项排入队列,而另一个项可以使另一个项出列)。如果您想知道如何,请发布有关该问题的具体问题。

其次,即使我们假设一次只有一个线程可以访问单个队列,即使我们假设服务器将同时接收或从所有客户端发送数据,你仍然不需要为每个客户端提供不同的队列。为了避免限制系统性能,您只需要允许足够的并发来利用所有服务器的CPU。即使使用单个系统范围的队列,如果与服务器正在执行的其他工作相比,对队列/队列消息的排队速度足够快,则可能不会成为瓶颈。 (通过有效的实现,只需插入一个项目或从队列中移除一个项目就会非常快。这是一个非常简单的操作。)为了使该消息队列成为限制性能的瓶颈,要么你需要很多CPU,或者服务器正在做的其他事情都必须非常快。在这种情况下,您可以使用2或4个系统范围的队列来计算某些方案,以允许2倍或4倍的并发。

在多线程系统中使用工作队列的整个想法是:1)允许多个消费者从一个位置抓取所有工作,因此生产者可以“转储”他们在该单个位置所需的任何工作而无需担心关于哪个消费者会这样做,以及2)作为消费者的负载平衡机制。 (此外,如果生产者为消费者临时生成的工作太快,则工作队列可以充当“缓冲区”。)如果每个客户端都有一对专用的生产者 - 消费者线程,则会调用问你为什么需要使用队列。为什么不从专用生产者到相应的专用消费者进行同步“传递”呢?或者,为什么不使用每个客户端的单个线程作为生产者和消费者呢?以你提议的方式使用队列似乎并没有真正获得任何东西。