2010-06-25 112 views
3

據我已經能夠告訴cookielib線程安全;但後來這個帖子再次說明是五歲,所以可能是錯誤的。urllib2和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() 

每個工作線程,它的工作? (還是有更好的方法?)每個線程都會使用它自己的帳戶;所以工人不會分享他們的cookies這個事實並不是問題。

+0

僅供參考,OP提及的帖子可能是[this](http://bytes.com/topic/python/answers/40838-cookielib-urllib2-thread-safe)之一。 – 2011-04-28 21:00:25

回答

2

你想使用pycurl(Python的接口libcurl)。它是線程安全的,支持cookies,https等。界面有點奇怪,但它只是需要一點習慣。

我只使用pycurl w/HTTPBasicAuth + SSL,但我找到了一個使用pycurl和cookies的示例here。我相信你需要更新pycurl.COOKIEFILE(第74行)和pycurl.COOKIEJAR(第82行),以獲得一些獨特的名字(可能是id(self.crl)的關鍵字)。

我記得,您需要爲每個請求創建一個新的pycurl.Curl()以維護線程安全。

1

和你一樣的問題。如果你不使用pycurl,我想你必須在每個urllib2.urlopen之前使用urllib2.install_opener(self.opener)。

也許我也應該使用pycurl,urllib2並不那麼聰明。

2

你可以看到執行庫[python_install_path]/lib/cookielib.py確保cookielib.CookieJar是線程安全的

這意味着,如果你將分享在不同的線程數的連接之間的CookieJar一個實例,你不會面對甚至設置cookie的不一致讀,因爲CookieJar用途鎖定self._cookies_lock內。