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

python之线程同步的更多相关文章

  1. 孤荷凌寒自学python第四十三天python 的线程同步之Queue对象

     孤荷凌寒自学python第四十三天python的线程同步之Queue对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Queue对象是直接操作队列池的对象,队列中可以存放多种对象,当然也 ...

  2. 孤荷凌寒自学python第四十一天python的线程同步之Event对象

     孤荷凌寒自学python第四十一天python的线程同步之Event对象 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 鉴于Lock锁与RLock锁均宣告没有完全完成同步文件操作的问题,于 ...

  3. python多线程--线程同步

    如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步. 使用Thread对象的Lock和Rlock可以实现简单的线程同步,这两个对象都有acquire ...

  4. Python多线程(2)——线程同步机制

    本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Se ...

  5. python lock, semaphore, event实现线程同步

    lock 机制不管你是java, C#, 还是python都是常用的线程同步机制, 相比较C# 的锁机制, python的加锁显得比较简单, 直接调用threading 标准库的lock 就可以了. ...

  6. python线程同步原语--源码阅读

    前面两篇文章,写了python线程同步原语的基本应用.下面这篇文章主要是通过阅读源码来了解这几个类的内部原理和是怎么协同一起工作来实现python多线程的. 相关文章链接:python同步原语--线程 ...

  7. Python线程同步

    线程执行 join与setDaemon 子线程在主线程运行结束后,会继续执行完,如果给子线程设置为守护线程(setDaemon=True),主线程运行结束子线程即结束: 如果join()线程,那么主线 ...

  8. Python并发编程-进程 线程 同步锁 线程死锁和递归锁

    进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...

  9. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

随机推荐

  1. ue4 蓝图方法备份

    normalized 标准化 向量标准化 +- 1,1,1 内的值 角度标准化 +-180内的值 delta A-B (输出时roll在后面)  角度相减 interp 插值运算 (做平滑移动常用)  ...

  2. Kaldi如何统计data数据集

    统计时长 wav-to-duration scp:data/train/wav.scp ark,t:- 2>/dev/null|awk 'BEGIN{SUM=0}{SUM+=$2}END{pri ...

  3. Java基础_0303:封装性初步

    class Book { // 定义一个新的类 private String title; // 书的名字 private double price; // 书的价格 public void getI ...

  4. Windows IIS 使用批处理脚本自动安装与卸载

    IIS6:适用于win server 2003 :: ******************* :: * 安装 :: ******************* :Install Cls @echo. &a ...

  5. 【tmos】字段update_time如何动态的更新

    1.数据库设置 2.数据库不设置,用Jpa的注解来完成 @EnableJpaAuditing注解 @SpringBootApplication @EnableJpaAuditing public cl ...

  6. mysql 案例 ~ mysql主从复制错误问题

    简介 mysql主从不同步的几种情况 一  具体情况   1 主库有memory引擎的内存表      分析 由于memory表的数据存放在内存中,一旦主库数据丢失,从库可能就会发生数据复制异常    ...

  7. Callable的用法示例

    //Runnable是执行工作的独立任务,但是它不返回任何值.在JavaSE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表的是从方法call()中返回的值,并且必须使用Execut ...

  8. python print输出带颜色 总结

    书写格式:      开头部分:\033[显示方式;前景色;背景色m + 结尾部分:\033[0m      注意:开头部分的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个:另外由 ...

  9. 通过全备+relaylog同步恢复被drop的库或表【转】

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 伪master+Binlog+同步 利用b ...

  10. shell文本左右对齐排版【转】

    文本左右对齐排版 有文本4.txt如下: 111111111111111111111 98912 张三 222222222222222222 150020 李四四 333333333333333333 ...