鍍金池/ 問答/Python/ python 中的with lock 的含義

python 中的with lock 的含義

global total

    try:
        html = etree.HTML(item)
        result = html.xpath('//div[contains(@id,"qiushi_tag")]')
        for site in result:
            try:
                imgUrl = site.xpath('.//img/@src')[0]
                title = site.xpath('.//h2')[0].text
                content = site.xpath('.//div[@class="content"]/span')[0].text.strip()
                vote = None
                comments = None
                try:
                    vote = site.xpath('.//i')[0].text
                    comments = site.xpath('.//i')[1].text
                except:
                    pass
                result = {
                    'imgUrl': imgUrl,
                    'title': title,
                    'content': content,
                    'vote': vote,
                    'comments': comments,
                }

                with self.lock:
                    # print 'write %s' % json.dumps(result)
                    self.f.write(json.dumps(result, ensure_ascii=False).encode('utf-8') + "\n")

            except Exception, e:
                print 'site in result', e
    except Exception, e:
        print 'parse_data', e
    with self.lock:
        total += 1
        
        

這里用了兩次的with lock 第一個是加鎖,防止競爭寫資源,但是第二個為啥又是with lock 這兩個啥關(guān)系?

回答
編輯回答
哎呦喂

兩次是相同的,例如兩個線程同時給total+1,如果不加鎖,就會兩個同時操作,導(dǎo)致total最終只+1,實際上是+2的

2017年10月18日 01:34
編輯回答
傲寒

為了防止多線程同時修改total,如果不加鎖,且不巧在處理過程中GIL做了切換,最后的數(shù)值就錯了。

import dis
total = 0

def foo():
    global total
    total += 1

dis.dis(foo)

實際處理過程:

6             0 LOAD_GLOBAL              0 (total)
              2 LOAD_CONST               1 (1)
              4 INPLACE_ADD
              6 STORE_GLOBAL             0 (total)
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

可見需要多個字節(jié)碼的處理,再次過程中線程是可能切換的

2018年7月14日 05:47
編輯回答
祈歡

如果是多線程,total是class變量,如果沒有加鎖,多個線程同時對total操作,因為total += 1不是原子性操作,最后的結(jié)果就錯了,所以要加個鎖。

2017年4月22日 09:02
編輯回答
命于你

應(yīng)該沒啥關(guān)系,就是復(fù)用一個lock而已。

2017年7月12日 18:48