Python urllib2和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

据我所知,cookielib不是线程安全的;但话说回来,这篇文章已经发表五年了,所以它可能是错的

然而,我一直在想- 如果我生成这样的类:

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
使用lock
self.\u cookies\u lock
作为参考,post OP提到的可能就是其中之一。