Python Socket和Thread池,如何获得更多性能?

我正在尝试实现一个基本的lib来发出HTTP GET请求.我的目标是通过套接字连接接收数据 – 简化设计以提高性能 – 使用线程,线程池.

我有一堆链接,我按其主机名分组,所以这里是输入网址的简单演示:

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

我打算使用套接字,因为性能问题.我打算使用一些保持连接的套接字(如果可能,通常是这样)并发出HTTP GET请求.这个想法来自连续请求的urllib低性能,然后我遇到urllib3,然后我意识到它使用httplib然后我决定尝试套接字.所以这就是我迄今为止所取得的成就:

GETSocket class, SocketPool class, ThreadPool and Worker classes

GETSocket类是Python的httplib的缩小的“仅HTTP GET”版本.

所以,我使用这样的类:

sp = Comm.SocketPool(host,size=self.poolsize, timeout=5)
for link in linklist:
    pool.add_task(self.__get_url_by_sp, self.count, sp, link, results)
    self.count += 1
    pool.wait_completion()
    pass

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

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

我已经阅读了关于asyncore here,但我无法弄清楚如何使用提供的类HTTPClient(asyncore.dispatcher)使用相同的套接字连接.

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

请具体说明您的经验,我不打算导入另一个库来执行HTTP GET,因此我想编写自己的小型库.

任何帮助表示感谢,谢谢.

解决方法:

做这个.

使用多处理. http://docs.python.org/library/multiprocessing.html.

>编写一个将所有URL放入队列的工作进程.
>编写一个工作进程,该进程从队列中获取URL并进行GET,保存文件并将文件信息放入另一个队列.您可能需要此过程的多个副本.你必须尝试找出正确的数字.
>编写一个工作进程从队列中读取文件信息并执行您正在尝试执行的任何操作.

上一篇:c# – 在Parallel.Invoke中命名一个线程会导致异常“此属性已设置且无法修改”.


下一篇:Python:在不同过程中将Pool对象传递给函数