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

前言

关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸。

为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸熟了再开吃,那么python如何模拟这种场景呢?

一、未锁定

1.如果多个线程同时操作某个数据,会出现不可预料的结果。比如以下场景:当小伙伴a在往火锅里面添加鱼丸的时候,小伙伴b在同时吃掉鱼丸,这很有可能导致刚下锅的鱼丸被夹出来了(没有熟),或者还没下锅,就去夹鱼丸(夹不到)。

```

# coding=utf-8

import threading

import time

def chiHuoGuo(people, do):

print("%s 吃火锅的小伙伴:%s" % (time.ctime(),people))

time.sleep(1)

for i in range(3):

time.sleep(1)

print("%s %s正在 %s 鱼丸"% (time.ctime(), people, do))

print("%s 吃火锅的小伙伴:%s" % (time.ctime(),people))

class myThread (threading.Thread):   # 继承父类threading.Thread

def __init__(self, people, name, do):

'''重写threading.Thread初始化内容'''

threading.Thread.__init__(self)

self.threadName = name

self.people = people

self.do = do

def run(self):   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数

'''重写run方法'''

print("开始线程: " + self.threadName)

chiHuoGuo(self.people, self.do)     # 执行任务

print("qq交流群:226296743")

print("结束线程: " + self.name)

print("yoyo请小伙伴开始吃火锅:!!!")

# 设置线程组

threads = []

# 创建新线程

thread1 = myThread("xiaoming", "Thread-1", "添加")

thread2 = myThread("xiaowang", "Thread-2", "吃掉")

# 添加到线程组

threads.append(thread1)

threads.append(thread2)

# 开启线程

for thread in threads:

thread.start()

# 阻塞主线程,等子线程结束

for thread in threads:

thread.join()

time.sleep(0.1)

print("退出主线程:吃火锅结束,结账走人")

```

运行结果:

二、 线程同步(锁lock)

1.为了避免以上这种情况发生,就引入锁的概念,锁有两种状态:锁定和未锁定

2.每当一个线程a要访问共享数据时,必须先获得锁定;如果已经有别的线程b获得锁定了,那么就让线程a暂停,也就是同步阻塞;等到线程b访问完毕,释放锁以后,再让线程a继续。

3.用threading.Lock()这个类里面的两个方法

- acquire() 锁住

- release() 释放锁

```

# coding=utf-8

import threading

import time

def chiHuoGuo(people, do):

print("%s 吃火锅的小伙伴:%s" % (time.ctime(),people))

time.sleep(1)

for i in range(3):

time.sleep(1)

print("%s %s正在 %s 鱼丸"% (time.ctime(), people, do))

print("%s 吃火锅的小伙伴:%s" % (time.ctime(),people))

class myThread (threading.Thread):   # 继承父类threading.Thread

lock = threading.Lock()  # 线程锁

def __init__(self, people, name, do):

'''重写threading.Thread初始化内容'''

threading.Thread.__init__(self)

self.threadName = name

self.people = people

self.do = do

def run(self):   # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数

'''重写run方法'''

print("开始线程: " + self.threadName)

# 执行任务之前锁定线程

self.lock.acquire()

chiHuoGuo(self.people, self.do)     # 执行任务

# 执行完之后,释放锁

self.lock.release()

print("qq交流群:226296743")

print("结束线程: " + self.name)

print("yoyo请小伙伴开始吃火锅:!!!")

# 设置线程组

threads = []

# 创建新线程

thread1 = myThread("xiaoming", "Thread-1", "添加")

thread2 = myThread("xiaowang", "Thread-2", "吃掉")

# 添加到线程组

threads.append(thread1)

threads.append(thread2)

# 开启线程

for thread in threads:

thread.start()

# 阻塞主线程,等子线程结束

for thread in threads:

thread.join()

time.sleep(0.1)

print("退出主线程:吃火锅结束,结账走人")

```

运行结果:

(0)

相关推荐

  • 简单明了的 Python 多线程来了

    线程和进程   计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行. 如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间开工时其它车间不能工作,也就是一个CPU一次只 ...

  • Python进程与线程知识

    Python进程与线程知识,Python开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下Python进程与线程知识小结,本篇文章具有一定的参考借鉴价值,感兴趣的小伙伴来了解一下吧 ...

  • python 多线程知识全面解析

    Python编程学堂 4天前 非阻塞启动线程 import threadingimport timedef one_thread(name,id): print("start....&quo ...

  • python笔记12-python多线程之事件(Event)

    前言 小伙伴a,b,c围着吃火锅,当菜上齐了,请客的主人说:开吃!,于是小伙伴一起动筷子,这种场景如何实现 一. Event(事件) Event(事件):事件处理的机制:全局定义了一个内置标志Flag ...

  • python多任务【一】- 线程:同步|互斥锁|死锁

    一.同步 1.同步的概念 同步就是协同步调,按预定的先后次序进行运行.如:你说完,我再说. "同"字从字面上容易理解为一起动作 其实不是,"同"字应是指协同.协 ...

  • C#线程学习笔记六:线程同步--信号量和互斥体

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用.     ...

  • python笔记7-多线程threading

    前言 1.python环境2.7 2.threading模块系统自带 一. 单线程 1.平常写的代码都是按顺序挨个执行的,就好比吃火锅和哼小曲这两个行为事件,定义成两个函数,执行的时候,是先吃火锅再哼 ...

  • python笔记8-多线程threading之封装式

    前言 冬天到了,小伙伴们最喜欢和好朋友一起吃火锅了,那么这种多个人同时吃火锅的场景如何用python实现呢? 一.执行函数 1.先写一个执行函数,用来实现做某件事情,不同的人吃火锅用一个参数peopl ...

  • python笔记9-多线程Threading之阻塞(join)和守护线程(setDaemon)

    前言 今天小编YOYO请xiaoming和xiaowang吃火锅,吃完火锅的时候会有以下三种场景: - 场景一:小编(主)先吃完了,xiaoming(客)和xiaowang(客)还没吃完,这种场景会导 ...

  • python笔记13-多线程实践篇(tomorrow)

    前言 前面几篇连续讲解了多线程的一些概念,都是一些理论的东西,有了一些理论基础了,接下来就让我们把所学的知识用到实践中吧! 一. 安装 1.tomorrow安装,用pip可以直接安装 > pip ...

  • python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!

    你知道吗? 在我的心里 你是多么的重要 就像 恩 请允许我来一段 freestyle 你们准备好了妹油 你看 这个碗 它又大又圆 就像 这条面 它又长又宽 你们 在这里 看文章 觉得 很开心 就像 我 ...

  • jt叔叔经方本草 笔记10

    桂枝加龙骨牡蛎汤:(补药篇) 桂枝(三两),芍药(三两),甘草(二两,炙),生姜(三两),大枣(十二枚),龙骨(三两),牡蛎(三两) 右七味,以水七升,煮取三升,去滓,分温三服. 龙骨牡蛎生用,比较容 ...