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

时间:2014-09-04 16:45:08

标签: multithreading curl libcurl

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

我想做的是小组'从每个客户端发送到他们自己的数据结构(比如一些链表)的数据,并同时处理这些列表。吞吐量非常重要,因此我希望能够同时发送尽可能多的数据(假设最多可同时处理10k个简单句柄)。

我想到的方法是:

  1. 拥有一个大型线程池(比如100个线程),每个进程都很容易处理。
  2. 只需一个线程处理所有10k简易手柄的多手柄。
  3. 创建处理多个句柄的多个线程(比如4个),因此每个处理2500个简单句柄。
  4. 每个客户端都有一个多句柄,因此可能有100个线程处理多个句柄。
  5. 我想知道的是,我是否可以“结合”。 #2和#3使得我有一个线程可以处理单个事件循环中的多个多句柄。这样的事情是否允许,如果是这样,它甚至会有意义吗?如果可能的话,它将满足我对每个多句柄分组客户端处理的要求,并且还允许我利用每个多句柄的持久连接。如果没有,我完全利用所有客户端的持久连接的唯一方法是选项#4。我希望减少因使用我们遵循的编程模型的某些限制而使用的线程数。

1 个答案:

答案 0 :(得分:4)

这是一个如此复杂的问题,不可能简单回答。它还取决于许多当地条件和您可能拥有的其他要求,但这里没有说明。我建议你制作一些原型,并根据你的具体情况相互衡量。

:你可以在同一个帖子中使用多个多句柄,但它可能会有点古怪,我不认为你会从中看到任何好处而不只是使用一个并将所有简易句柄添加到单个句柄中。

我的个人偏好是#3,但是可能只是稍微多于4的线程,因为今天你很容易拥有8个线程的CPU,很快就会有16个,而且对于这些情况你会受到CPU限制#&# 39;最好尽可能地分散负载以获得最高性能(但不能过多地从缓存和连接重用等中获得)。

此外,由于每个多手柄然后处理N个易操作,因此总是存在您必须为特殊传输做某事的风险,这使得其他N-1传输暂停一点,然后如果你将总数分成几个线程,那就更好了,这样它就不会阻止所有转移。

最后,为了快速实现这一目标,您可能希望使用curl_multi_socket_action基于事件的API来获得最佳性能。