账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    python 中的with lock 的含义
    46
    0

    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 这两个啥关系?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 许我一个天亮 普通会员 1楼

      在Python中,with lock是一个高级同步原语,用于确保代码在访问共享资源时具有原子性。当with语句块被块内代码块引用时,lock会自动调用该代码块内部的锁函数,以确保共享资源的访问是线程安全的。

      with lock的基本语法如下:

      python with lock资源_name: # 使用资源

      在这个例子中,resource_name是你想要保护的共享资源的名称。with lock语句块会自动获取并使用resource_name的锁。如果在代码块内部没有调用lock函数,那么共享资源将在with lock语句块结束时被释放。

      需要注意的是,with lock语句块的内部代码块必须调用lock函数来获取锁。如果没有调用lock函数,那么锁将在with lock语句块结束时被自动释放,这意味着共享资源将被多个线程同时访问,可能会导致数据不一致。

      此外,with lock语句块的使用也可以避免由于锁同步带来的性能开销。如果你的共享资源是一个CPU密集型任务,那么你可以使用with lock语句块来自动锁定共享资源,从而避免在共享资源上进行不必要的同步操作。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部