我看过类似的问题,但似乎对使用HTTP处理线程的最佳方式存在很多分歧。
我特别想做的事情:我正在使用Python 2.7,我想尝试使用每个SOCKS5代理来处理HTTP请求(特别是POST事物)。代码我已经工作了,但是相当缓慢,因为它等待每个请求(到代理服务器,然后是Web服务器)在启动另一个之前完成。每个线程最有可能使用不同的SOCKS代理发出不同的请求。
到目前为止,我一直在使用urllib2。我查看了像PycURL这样的模块,但是在Windows上使用Python 2.7进行正确安装是非常困难的,我想支持它,我正在编写代码。我愿意使用任何其他模块。
我特别关注了这些问题:
Python urllib2.urlopen() is slow, need a better way to read several urls
Python - Example of urllib2 asynchronous / threaded request using HTTPS
许多例子得到了支持和争论。假设评论者是正确的,使用像Twisted这样的异步框架的客户端听起来像是最快的使用方法。但是,我用Google搜索,并没有为SOCKS5代理提供任何形式的支持。我目前正在使用Socksipy模块,我可以尝试类似:
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, IP, port)
socks.wrapmodule(twisted.web.client)
我不知道这是否会起作用,我甚至不知道Twisted是否是我真正想要使用的。我也可以使用线程模块并将其用于我当前的urllib2代码,但如果这比Twisted慢得多,我可能不想打扰。有没有人有任何见解?
答案 0 :(得分:3)
也许更简单的方法就是依靠gevent(或eventlet)来打开许多与服务器的连接。这些库monkeypatch urllib然后使异步,同时仍然让你编写sync-ish代码。它们与线程相比较小的开销也意味着你可以产生更多(1000s并不罕见)。
我使用了类似这样的东西(从here抄袭):
urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']
import gevent
from gevent import monkey
# patches stdlib (including socket and ssl modules) to cooperate with other greenlets
monkey.patch_all()
import urllib2
def print_head(url):
print ('Starting %s' % url)
data = urllib2.urlopen(url).read()
print ('%s: %s bytes: %r' % (url, len(data), data[:50]))
jobs = [gevent.spawn(print_head, url) for url in urls]