Python urllib2和cookielib线程安全
据我所知,cookielib不是线程安全的;但话说回来,这篇文章已经发表五年了,所以它可能是错的 然而,我一直在想- 如果我生成这样的类:Python urllib2和cookielib线程安全,python,multithreading,thread-safety,urllib2,Python,Multithreading,Thread Safety,Urllib2,据我所知,cookielib不是线程安全的;但话说回来,这篇文章已经发表五年了,所以它可能是错的 然而,我一直在想- 如果我生成这样的类: class Acc: jar = cookielib.CookieJar() cookie = urllib2.HTTPCookieProcessor(jar) opener = urllib2.build_opener(cookie) headers = {} def __init__ (self,l
class Acc:
jar = cookielib.CookieJar()
cookie = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(cookie)
headers = {}
def __init__ (self,login,password):
self.user = login
self.password = password
def login(self):
return False # Some magic, irrelevant
def fetch(self,url):
req = urllib2.Request(url,None,self.headers)
res = self.opener.open(req)
return res.read()
对于每个辅助线程,它会工作吗?(或者有更好的方法吗?)每个线程都会使用自己的帐户;因此,工作人员不会共享他们的cookie这一事实并不是一个问题。您想要使用的(python接口)。它是线程安全的,支持cookie、https等。。界面有点奇怪,但需要一点时间来适应
我只使用了pycurl w/HTTPBasicAuth+SSL,但我确实找到了一个使用pycurl和cookies的示例。我相信您需要更新pycurl.COOKIEFILE(第74行)和pycurl.COOKIEJAR(第82行)以获得一些唯一的名称(可能键入id(self.crl)
)
我记得,您需要为每个请求创建一个新的
pycurl.Curl()
,以维护线程安全。问题与您相同。如果不使用pycurl,我认为必须在每个urllib2.urlopen之前安装_opener(self.opener)
也许我也应该使用pycurl,urllib2不是那么聪明。您可以看到库的实现
[python\u install\u path]/lib/cookielib.py
以确保cookielib.CookieJar
是线程安全的
这意味着,如果您将在不同线程中的多个连接之间共享一个
CookieJar
实例,您甚至不会面临Cookie集的不一致读取,因为CookieJar
使用lockself.\u cookies\u lock
作为参考,post OP提到的可能就是其中之一。