Python curl中的多接口是否比使用多个简单接口更快或更高效?

Python curl中的多接口是否比使用多个简单接口更快或更高效?,python,curl,pycurl,Python,Curl,Pycurl,我正在制作一些涉及pycurl的东西,因为pycurl依赖于libcurl,我在阅读它的文档时遇到了这个多接口,您可以使用单个多对象执行多个传输。我想知道这是否比拥有多个简单的接口更快/更节省内存?我想知道这种方法的优势是什么,因为网站几乎没有说 “在同一线程中启用多个同时传输,而不会使应用程序变得复杂。”在同一线程中同时运行多个简单接口意味着构建自己的反应器,并在较低级别上驱动curl。这在C语言中是痛苦的,在Python中也是痛苦的,这就是为什么libcurl提供并推荐了multi 但“在同

我正在制作一些涉及pycurl的东西,因为pycurl依赖于libcurl,我在阅读它的文档时遇到了这个多接口,您可以使用单个多对象执行多个传输。我想知道这是否比拥有多个简单的接口更快/更节省内存?我想知道这种方法的优势是什么,因为网站几乎没有说


“在同一线程中启用多个同时传输,而不会使应用程序变得复杂。”

在同一线程中同时运行多个简单接口意味着构建自己的反应器,并在较低级别上驱动curl。这在C语言中是痛苦的,在Python中也是痛苦的,这就是为什么
libcurl
提供并推荐了multi

但“在同一条线上”是关键。您还可以创建一个线程池,并将easy实例放入其中。在C中,这仍然是痛苦的;在Python中,它非常简单。事实上,文档中使用concurrent.futures.ThreadPoolExecutor的第一个示例做了类似的事情,但实际上比这里需要的更复杂,而且它仍然只是几行代码

如果你将multi与easy与手动反应器进行比较,那么简单性是主要优势。在C语言中,您可以轻松实现一个比
libcurl
使用的更高效的反应器;在Python中,这可能是真的,也可能不是真的。但在这两种语言中,在少数几个网络请求之间切换的性能成本与您正在做的其他事情相比将非常小,尤其是在等待这些网络请求时,这一点根本不重要


如果将multi与easy与线程池进行比较,那么reactor肯定会优于线程(除了在可以将线程池绑定到proactor的平台上,如Windows I/O完成端口),特别是对于大量并发连接。此外,每个线程都需要自己的堆栈,这通常意味着分配了大约1MB的内存页(尽管并不是全部使用),对于大量连接来说,这在32位内存中可能是一个严重的问题。这就是为什么很少有严肃的服务器使用线程进行连接。但在一个建立了少量关系的客户中,这些都无关紧要;同样,与程序的实际成本相比,浪费8个线程与使用反应器所产生的成本将非常小,因此它们将无关紧要。

您正在尝试优化一些根本不重要的东西

如果您想尽快下载200个URL,您将花费99.99%的时间等待这200个请求,这受您的网络和/或下载服务器的限制。优化的关键是使并发请求的数量正确。你能做的任何减少最后0.01%的事情都不会对你的程序产生明显的影响。(见附件。)

不同的来源提供不同的指导原则,但通常是在6-12个请求之间,对同一服务器的请求不超过2-4个。既然你都是从谷歌获取的,我建议你启动4个并发请求,如果还不够快的话,调整这个数字直到你得到最好的结果

至于空间,存储200页的开销将远远超过几十个字节的开销。同样,您要优化的是这200个页面,将它们存储到磁盘而不是内存中,在它们进入时解析它们,而不是下载所有内容,然后解析所有内容,等等

无论如何,与其查看您拥有的命令行工具并尝试查找与这些工具类似的库,不如直接查找库
pycurl
在某些情况下可能很有用,例如,当您试图做一些复杂的事情,并且您已经知道如何使用
libcurl
来完成它时,但一般来说,使用stdlib模块(如
urllib
)或设计为尽可能简单的第三方模块(如
请求
)会容易得多


文档中的说明显示了如何准确地执行您想要执行的操作。(如果您使用的是Python2.x,那么您必须
pip安装futures
来获取
ThreadPoolExecutor
的后端口,并使用
urllib2
而不是
urllib.request
,否则代码将是相同的。)

出于好奇,您使用
pycurl
而不是stdlib有什么原因吗,
请求
,还是其他更像蟒蛇的东西?有时有很好的理由这样做,但最常见的是“我已经知道如何在
libcurl
中做好这一点,我希望这会转化为
pycurl
”,这里似乎不是这样。@abarnert我正在寻找最有效的(执行时间或内存)解决方案。我只知道unix中的Curl和Wget命令。所以我开始寻找在Python中使用Curl的方法,我发现了PyCurl。因为我在PyCurl上只花了最后一个小时,还没有写任何代码,所以我准备换一种方式。因为PyCurl使用的是用C编写的Libcurl,所以我认为它会非常有效。我知道这可能不是真的。我正在构建一个单词,意思是查找实用程序。谷歌搜索了大约200个单词的意思。“你为什么要寻找最有效的解决方案?时间上的限制因素是你的网络或远程服务器;在服务器上浪费的任何时间都是无关紧要的。空间上的限制因素是容纳200个完整的页面;这里或那里浪费的任何十几个字节都是无关紧要的。这是最糟糕的情况。说得很好,先生。Readi”ng您的回答让我对整个事情感到好奇,我想了解更多关于如何建立对同一服务器的限制2-4个请求的信息。情况并非总是如此。这完全取决于任务。必须同时刮取1000页