返回顶部
首页 > 资讯 > 后端开发 > Python >Python的Lock和conditio
  • 409
分享到

Python的Lock和conditio

PythonLockconditio 2023-01-31 08:01:18 409人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

Python的Lock和condition使用 Lock是threading模块提供的锁对象,Lock默认创建的是一个锁对象,当我们需要对全局对象进行操作的时候,可以通过Lock创建对象来锁定对象,Lock对象就好比java中的syn

Python的Lock和condition使用

Lock是threading模块提供的对象,Lock默认创建的是一个锁对象,当我们需要对全局对象进行操作的时候,可以通过Lock创建对象来锁定对象,Lock对象就好比java中的synchronize(aObject)代码中的aObject对象。

而condition除了具有Lock对象的acquire方法和release方法外,还有wait、notify、notifyAll方法等用于条件处理。Condition对象可以在某些事件触发或者达到特定条件后才处理数据。很像java中锁一个对象后,对象调用notify或者notifyAll方法去触发操作。Condition还支持从外界引用一个Lock对象。

Lock示例代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import threading
class MyThread(threading.Thread):
    def run(self):
        global counter
        time.sleep(1)

        # 获得锁对象
       
if mutex.acquire(1):
            counter = counter + 1
            msg = self.name + ' set counter to ' + str(counter)
            print msg
            #释放锁
           
mutex.release()
# 全局变量
counter = 0
#产生一个互斥锁
mutex = threading.Lock()
def test():
    for i in range(0, 5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()

 

 

输出内容:

Thread-1 set counter to 1

Thread-3 set counter to 2

Thread-2 set counter to 3

Thread-4 set counter to 4

Thread-5 set counter to 5

 

 

Condition代码示例:

#!/usr/bin/env Python
# -*- coding: utf-8 -*-
import threading, time
class Seeker(threading.Thread):
    def __init__(self, cond, name):
        super(Seeker, self).__init__()
        self.cond = cond
        self.name = name
    def run(self):
        self.cond.acquire()
        print self.name + ': 我已经把眼睛蒙上了'

        """
        notify源码解析
            __waiters = self.__waiters
            waiters = __waiters[:n] # 获取等待队列中的n个等待锁
            for waiter in waiters:
            waiter.release() # 释放Hider的等待锁
            try:
                __waiters.remove(waiter)
            except ValueError:
                pass
        """
       
# 释放n个waiter锁,waiter线程准备执行
       
self.cond.notify()
        print('notifyed...')
        # 释放condition条件锁,waiter线程Hider真正开始执行
       
self.cond.wait()
        print('waited...')
        print self.name + ': 我找到你了 ~_~'
       
self.cond.notify()
        self.cond.release()
        print self.name + ': 我赢了'

class
Hider(threading.Thread):
    def __init__(self, cond, name):
        super(Hider, self).__init__()
        self.cond = cond
        self.name = name
    def run(self):
        self.cond.acquire()
        """
        wait()源码解析:
            waiter = _allocate_lock() # 创建一把等待锁,加入waiters队列,等待notify唤醒
            waiter.acquire() # 获取锁
            self.__waiters.append(waiter)
            saved_state = self._release_save() # 释放condition.lock全局条件锁,以便其他等待线程执行
            if timeout is None:
                waiter.acquire() # 再次获取锁,因为已经锁定无法继续,等待notify执行release
        """
       
# wait()释放对琐的占用,同时线程挂起在这里,直到被notify并重新占有琐。
       
self.cond.wait()
        print self.name + ': 我已经藏好了,你快来找我吧'
       
self.cond.notify()
        self.cond.wait()
        self.cond.release()
        print self.name + ': 被你找到了,哎~~~'
cond = threading.Condition()
hider = Hider(cond, 'hider')
seeker = Seeker(cond, 'seeker')
hider.start()
seeker.start()
hider.join()
seeker.join()
print('end...')

 

 

输出结果:

seeker: 我已经把眼睛蒙上了

notifyed...

hider: 我已经藏好了,你快来找我吧

waited...

seeker: 我找到你了 ~_~

seeker: 我赢了

 hider: 被你找到了,哎~~~

end...

 

Python的Lock和condition使用

--结束END--

本文标题: Python的Lock和conditio

本文链接: https://lsjlt.com/news/192533.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python的Lock和conditio
    Python的Lock和condition使用 Lock是threading模块提供的锁对象,Lock默认创建的是一个锁对象,当我们需要对全局对象进行操作的时候,可以通过Lock创建对象来锁定对象,Lock对象就好比java中的syn...
    99+
    2023-01-31
    Python Lock conditio
  • Latch和Lock的区别
    Latch是Oracle提供的轻量级锁资源,他用于快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,他只工作在内存中, 我们可以不大准确的说,内存中资源的锁叫latch,数据库对象...
    99+
    2024-04-02
  • synchronized和Lock的区别
    一、基础操作的区别 synchronized:在Java中,synchronized是内置的关键字,它能够保证在同一时刻非常多只有一个线程执行该段代码,以实现对共享资源的同步访问。当一个线程进入synchronized声明的同步代码块...
    99+
    2023-10-29
    区别 synchronized Lock
  • Latch和Lock的区别是什么
    本篇内容介绍了“Latch和Lock的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 本文向各...
    99+
    2024-04-02
  • 怎么理解Oracle的lock和latch
    这篇文章主要介绍“怎么理解Oracle的lock和latch”,在日常操作中,相信很多人在怎么理解Oracle的lock和latch问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • 详解Java中的锁Lock和synchronized
    目录一、Lock接口1、Lock接口和synchronized内置锁2、lock接口使用的一般形式3、Lock接口的方法4、相比于synchronized,Lock接口所具备的其他特...
    99+
    2024-04-02
  • MySQL Innodb怎么让MDL LOCK和ROW LOCK记录到errlog
    本篇内容主要讲解“MySQL Innodb怎么让MDL LOCK和ROW LOCK记录到errlog”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL I...
    99+
    2024-04-02
  • Python线程锁Lock的使用介绍
    这篇文章主要讲解了“Python线程锁Lock的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python线程锁Lock的使用介绍”吧!我们知道Python的线程是封装了底层操作系统...
    99+
    2023-06-02
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2024-04-02
  • Java中lock和tryLock及lockInterruptibly的区别
    目录1.lock 方法2.lockInterruptibly 方法3.tryLock 方法4.tryLock(long,TimeUnit) 方法5.总结在 Lock 接口中,获取锁的...
    99+
    2024-04-02
  • Binary Semaphore和Reentrant Lock的区别有哪些
    这篇文章主要讲解了“Binary Semaphore和Reentrant Lock的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Binary S...
    99+
    2024-04-02
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • 如何理解mysql innodb lock锁中的record lock
    本篇文章给大家分享的是有关如何理解mysql innodb lock锁中的record lock,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。...
    99+
    2024-04-02
  • 解决python-redis-lock分布式锁的问题
    python-redis-lock 官方文档 不错的博文可参考 问题背景 在使用celery执行我们的异步任务时,为了提高效率,celery可以开启多个进程来启动对应的worke...
    99+
    2024-04-02
  • synchronized 和 Lock 的异同点(如何让选择)
    目录相同点不同点如何选择前言: 我们主要学习 synchronized 和 Lock 的异同点,以及该如何选择。 相同点 synchronized 和 Lock 的相同点非常多,我们...
    99+
    2024-04-02
  • MYSQL METADATA LOCK(MDL LOCK)MDL锁问题的示例分析
    小编给大家分享一下MYSQL METADATA LOCK(MDL LOCK)MDL锁问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一...
    99+
    2024-04-02
  • python中的多线程锁lock=threading.Lock()使用方式
    目录多线程锁lock=threading.Lock()使用疑问解决方法例子python多线程中锁的概念锁可以独立提取出来概念线程不安全线程锁多线程锁lock=threading.Lo...
    99+
    2024-04-02
  • python中的多线程锁lock=threading.Lock()如何使用
    这篇文章主要介绍“python中的多线程锁lock=threading.Lock()如何使用”,在日常操作中,相信很多人在python中的多线程锁lock=threading.Lock()如何使用问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-07-02
  • MySQL中Lock Tables和Unlock Tables的作用是什么
    这期内容当中小编将会给大家带来有关MySQL中Lock Tables和Unlock Tables的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。锁定表的语法:L...
    99+
    2024-04-02
  • enq: TX – row lock contention的测试和案例分析
    参考:http://www.killdb.com/2015/07/13/%E5%85%B3%E4%BA%8Eenq-tx-row-lock-contention%E7%9A%84%E6%B5%8B%E8%A...
    99+
    2022-11-30
    tx contention enq
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作