在单个事件循环中是否允许多个cURL多句柄



我正在创建一个服务器,它将处理多个并发客户端连接(大约100个),客户端在其中注入大量数据和服务器包,并将其发送到另一个远程位置。

我想做的是将每个客户端发送的数据"分组"到它们自己的数据结构中(比如一些链表),并同时处理这些列表。吞吐量很重要,所以我希望能够同时发送尽可能多的数据(比如说,并行处理多达10k个简单处理)。

我想到的方法是:

  1. 有一个大的线程池(比如说100个线程),每个进程都有一个简单的句柄
  2. 所有10k简易手柄都有一个单螺纹手柄和一个多手柄
  3. 创建几个线程(比如4个)来处理一个多句柄,因此每个线程可以处理2500个简单句柄
  4. 每个客户端有一个多句柄,因此每个客户端可能有100个线程处理一个多手柄

我想知道的是,我是否可以"组合"#2和#3,这样我就有了一个在单个事件循环中处理多个多句柄的单个线程。这样的事情是允许的吗?如果允许的话,这有意义吗?如果可能的话,它将满足我对每个多句柄对客户端处理进行分组的要求,也将允许我利用每个多句柄的持久连接。如果没有,我完全利用所有客户端的持久连接的唯一方法是选项#4。由于我们所遵循的编程模型的某些限制,我希望减少使用的线程数量。

这是一个非常复杂的问题,无法简单回答。它还将取决于许多当地条件和您可能有的其他要求,但这里没有具体说明。我建议你建立一些原型,并根据你的特定条件相互衡量。

:你可以在同一个线程中使用多个多句柄,但这可能会有点奇怪,我认为你不会从中看到任何好处,而不仅仅是使用一个并将所有简单的句柄添加到单个句柄中。

我个人的偏好是#3,但可能会选择比4稍多的线程,因为现在你很容易就有8个线程的CPU,很快就会有16个,对于CPU受限的情况,你最好尽可能分散负载以获得最高性能(但不要太多,因为缓存和连接重用等仍会带来好处)。

此外,由于每个多句柄然后处理N个简单句柄,因此总有一种风险,即您必须为一个特殊的传输做一些事情,这会使其他N-1个传输暂停一段时间,然后最好将总数拆分为几个线程,这样它就不会阻止所有传输。

最后,为了获得这种速度,您可能需要使用基于curl_multi_socket_action事件的API来获得最大性能。

最新更新