Python套接字和线程池,如何获得更高的性能?

2024-10-01 11:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个基本的lib来发出httpget请求。我的目标是通过套接字连接接收数据采用极简设计来提高性能-使用线程、线程池。在

我有一堆链接,这些链接是按主机名分组的,下面是输入URL的简单演示:

hostname1.com - 500 links
hostname2.org - 350 links
hostname3.co.uk - 100 links
...

由于性能问题,我打算使用套接字。我打算使用一些保持连接的套接字(如果可能的话,通常是这样)并发出httpget请求。这个想法来自urllib对连续请求的低性能,然后我遇到了urllib3,然后我意识到它使用httplib,然后我决定尝试使用sockets。以下是我到目前为止所取得的成就:

GETSocket class, SocketPool class, ThreadPool and Worker classes

GETSocket类是Python的httplib的缩小版,“httpget-only”。在

所以,我是这样使用这些类的:

^{pr2}$

__get_url_by_sp函数是一个包装器,它调用sp.urlopen并将结果保存到results列表中。我使用的是5个线程的池,其中有一个5个GETSocket类的套接字池。在

我想知道的是,有没有其他可能的方法可以提高这个系统的性能?在

我读过关于asyncore here,但我不知道如何使用提供的class HTTPClient(asyncore.dispatcher)的相同套接字连接。在

另一点,我不知道我使用的是阻塞还是非阻塞套接字,哪一个对性能更好,或者如何实现哪个。在

请具体谈谈你的经验,我不打算导入另一个库来做httpget,所以我想编写我自己的小库。在

感谢任何帮助,谢谢。在


Tags: url目标链接liblinks性能线程sp
2条回答

我终于找到了一条很好的解决问题的途径。我在我的项目中使用了python3,我唯一的选择就是使用pycurl,因此我不得不将我的项目移植回python2.7系列。在

使用pycurl,我得到: -对我的请求的一致响应(实际上我的脚本必须处理至少10k个URL) -随着ThreadPool类的使用,我正在以我的系统最快的速度接收响应(接收到的数据将在稍后处理-因此在这里不太可能进行多处理)

我首先尝试了httplib2,通过切换到pycurl我失去了缓存支持,我意识到它并不像python2那样可靠。在

最后的结论是:当涉及到HTTP通信时,可能需要一个(py)curl这样的工具。它是一个救命稻草,尤其是当一个人在处理大量的url时(有时为了好玩,你会得到很多奇怪的响应)

谢谢你们的回复,伙计们。在

做这个。在

使用multiprocessinghttp://docs.python.org/library/multiprocessing.html。在

  1. 编写一个worker Process,它将所有URL放入Queue

  2. 编写一个worker Process,它从Queue获取一个URL并执行GET,保存一个文件并将文件信息放入另一个队列中。您可能需要此Process的多个副本。你得做个实验,找出多少才是正确的数字。

  3. 编写一个worker Process,它从Queue读取文件信息,并执行您正在尝试执行的任何操作。

相关问题 更多 >