我试图实现一个基本的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,所以我想编写我自己的小库。在
感谢任何帮助,谢谢。在
我终于找到了一条很好的解决问题的途径。我在我的项目中使用了python3,我唯一的选择就是使用pycurl,因此我不得不将我的项目移植回python2.7系列。在
使用pycurl,我得到: -对我的请求的一致响应(实际上我的脚本必须处理至少10k个URL) -随着ThreadPool类的使用,我正在以我的系统最快的速度接收响应(接收到的数据将在稍后处理-因此在这里不太可能进行多处理)
我首先尝试了httplib2,通过切换到pycurl我失去了缓存支持,我意识到它并不像python2那样可靠。在
最后的结论是:当涉及到HTTP通信时,可能需要一个(py)curl这样的工具。它是一个救命稻草,尤其是当一个人在处理大量的url时(有时为了好玩,你会得到很多奇怪的响应)
谢谢你们的回复,伙计们。在
做这个。在
使用
multiprocessing
。http://docs.python.org/library/multiprocessing.html。在编写一个worker
Process
,它将所有URL放入Queue
。编写一个worker
Process
,它从Queue
获取一个URL并执行GET,保存一个文件并将文件信息放入另一个队列中。您可能需要此Process
的多个副本。你得做个实验,找出多少才是正确的数字。编写一个worker
Process
,它从Queue
读取文件信息,并执行您正在尝试执行的任何操作。相关问题 更多 >
编程相关推荐