zoukankan      html  css  js  c++  java
  • python之线程同步

    lock与rlock

    使用lock不能连续两次获取锁,获取锁必须先释放锁。但是在一个线程中调用另一个函数时,在该函数中要继续操作共享的数据,这时获取锁就相当于连续执行两次获取锁,所以lock就不适用该场景,就要使用rlock了。

    condition(条件变量,用于复杂的线程间同步)

    场景:
    期待天猫与小爱的对话如下

    天猫:小爱同学
    小爱:在
    天猫:我们来对古诗吧
    小爱:好啊
    
    使用lock来实现
    import threading
    
    class XiaoAi(threading.Thread):
        def __init__(self, lock):
            super().__init__(name="小爱")
            self.lock = lock
    
        def run(self):
            self.lock.acquire()
            print("{} : 在 ".format(self.name))
            self.lock.release()
    
            self.lock.acquire()
            print("{} : 好啊 ".format(self.name))
            self.lock.release()
    
    class TianMao(threading.Thread):
        def __init__(self, lock):
            super().__init__(name="天猫精灵")
            self.lock = lock
    
        def run(self):
    
            self.lock.acquire()
            print("{} : 小爱同学 ".format(self.name))
            self.lock.release()
    
            self.lock.acquire()
            print("{} : 我们来对古诗吧 ".format(self.name))
            self.lock.release()
    
    if __name__ == '__main__':
        lock = threading.Lock()
        xiaoai = XiaoAi(lock)
        tianmao = TianMao(lock)
        tianmao.start()
        xiaoai.start()
    

    结果:

    可见lock并没有按照我们预期的方向去执行,因为第一点tianmao在start之后,在没有执行到小爱的start之前,天猫可能就将run方法里面的逻辑执行完毕。第二点GIL释放的时候是根据字节码执行的行数或时间片进行切换的,可能在执行天猫这个线程时,天猫反复拿到锁与释放锁,还没切换到小爱这个线程

    那么如何保证天猫说一句,小爱说一句,这就需要用到我们的contidion
  • 相关阅读:
    学生信息录入(学号 姓名 成绩),并按学号查找。
    char、signed char、unsigned char的区别
    C语言-数组
    如何选取网站主要内容(转)
    git pull和git fetch的区别(转)
    yolov3训练
    Docker容器图形界面显示(运行GUI软件)的配置方法
    切换Ubuntu默认python版本的两种方法
    多用户远程linux+内网穿透工具frp使用详解
    pycharm远程调试docker containers
  • 原文地址:https://www.cnblogs.com/raind/p/10188387.html
Copyright © 2011-2022 走看看