210.多线程
# 01.按序打印
# 1.1 题目描述
三个不同的线程 A、B、C 将会共用一个 Foo 实例。
- 一个将会调用 first() 方法
- 一个将会调用 second() 方法
- 还有一个将会调用 third() 方法
请设计修改程序,以确保 second() 方法在 first() 方法之后被执行
third() 方法在 second() 方法之后被执行。
class Foo(object):
def __init__(self):
pass
def first(self, printFirst: 'Callable[[], None]') -> None:
printFirst()
def second(self, printSecond: 'Callable[[], None]') -> None:
printSecond()
def third(self, printThird: 'Callable[[], None]') -> None:
printThird()
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 1.2 解题思路
from threading import Lock
class Foo:
def __init__(self):
self.firstJobDone = Lock() # 生成全局锁 threading.Lock()
self.secondJobDone = Lock() # 生成全局锁 threading.Lock()
self.firstJobDone.acquire() # 修改数据前加锁 lock.acquire()
self.secondJobDone.acquire() # 修改数据前加锁 lock.acquire()
def first(self, printFirst) -> None:
printFirst()
self.firstJobDone.release() # 修改后释放锁,通知正在等待完成第一个作业的线程
def second(self, printSecond) -> None:
with self.firstJobDone: # 等待第一项工作完成
printSecond()
self.secondJobDone.release() # 通知正在等待完成第二个作业的线程
def third(self, printThird) -> None:
with self.secondJobDone: # 等待第二项工作完成
printThird()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1.3 用户锁:线程锁
import time
import threading
lock = threading.Lock() #1 生成全局锁
def addNum():
global num #2 在每个线程中都获取这个全局变量
print('--get num:',num )
time.sleep(1)
lock.acquire() #3 修改数据前加锁
num -= 1 #4 对此公共变量进行-1操作
lock.release() #5 修改后释放
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 02.红绿灯路口
# 2.1 题目描述
这是两条路的交叉路口。
第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶。
第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶。
每条路在路口前都有一个红绿灯,红绿灯可以亮起红灯或绿灯。
上次更新: 2024/3/13 15:35:10