代码之家  ›  专栏  ›  技术社区  ›  The Unknown

C++并发获取请求

  •  2
  • The Unknown  · 技术社区  · 15 年前

    我正在编写一个C++应用程序,并希望通过HTTP GET请求同时请求多个数据文件,我应该在哪里开始查找(需要跨平台)。

    1. 运行应用程序
    2. 创建URL列表“ http://host/file1.txt “,” http://host/file2.txt “,” http://host/file3.txt “}
    3. 同时请求所有URL,并将内容加载到变量中(不希望磁盘写入)。每个文件都有大约10kB的数据。

    您建议我使用哪些库?诽谤?库尔普?助推ASIO?我需要滚动自己的多线程来同时请求所有文件吗?有更简单的方法吗?

    编辑:我需要同时请求大约1000个GET请求。最有可能的情况是,我将批量执行此操作(一次100个,并在完成一个连接时创建更多连接)。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Adam Rosenfield    15 年前

    我建议你 libcurl . 我不太熟悉它,但它确实有一个 multi-interface 用于同时执行多个HTTP操作。

    根据您使用的解决方案,可以在不使用多线程的情况下执行异步I/O。关键是要使用 select(2) 系统调用。 select() 获取一组文件描述符,并告诉您其中是否有可用的数据。如果有,您可以继续使用 read(2) recv(2) 不用担心阻塞。

        2
  •  2
  •   Steve Jessop    15 年前

    Web浏览器通常维护一个工作线程池来进行下载,并在它们变为空闲时将下载分配给它们。IIRC HTTP RFC有一些话要说,您应该同时与同一服务器建立多少同时连接:太多是不礼貌的。

    如果有几个请求是针对同一个服务器的,并且它支持保持活动(几乎每个人都这样做),那么这可能比在多个同时请求中垃圾邮件要好。一般的想法是,您将一个TCP/IP连接用于串联的多个请求,从而节省握手开销。在我实现JavaHTTPn连接类的实践中,实际结果是,引入一个微妙的bug,当您重新使用新请求的连接时,不总是正确地清除状态,并且花费相当长的时间盯着日志记录/嗅探器数据;

    libcurl当然支持keepalive(我认为默认情况下是启用的)。