py并发_线程同步笔记

线程同步

多线程编程是可以直接共享一个进程之内的全部资源(相比较多进程的同步处理来讲,多线程的同步处理需求更加迫切)对于整个的线程同步处理,也是提供有各种同步处理类(threading作为新一代线程实现模块):Lock&RLock(锁)、Event(同步事件)、Seamphore&BoundedSemaphore(信号量)、Barrier(栅栏)。

测试

信号量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding : UTF-8
import threading, time
def bank_handle(semaphore): # 定义银行的处理业务
if semaphore.acquire(): # 尝试获取信号量,如果没有获取就等待
print("[%s]资源抢占成功,开始办理个人业务..." % (threading.current_thread().name))
time.sleep(2)
semaphore.release() # 释放锁定
def main(): # 主函数
semaphore = threading.Semaphore(3) # 获取信号量同步锁
thread_list = [threading.Thread(target=bank_handle,args=(semaphore,),
name="银行客户 - %s" % item)
for item in range(10)]
for thread in thread_list:
thread.start()
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数

[银行客户 - 0]资源抢占成功,开始办理个人业务…
[银行客户 - 1]资源抢占成功,开始办理个人业务…
[银行客户 - 2]资源抢占成功,开始办理个人业务…
[银行客户 - 3]资源抢占成功,开始办理个人业务…[银行客户 - 4]资源抢占成功,开始办理个人业务…
[银行客户 - 5]资源抢占成功,开始办理个人业务…

[银行客户 - 7]资源抢占成功,开始办理个人业务…[银行客户 - 6]资源抢占成功,开始办理个人业务…

[银行客户 - 8]资源抢占成功,开始办理个人业务…
[银行客户 - 9]资源抢占成功,开始办理个人业务…

进程已结束,退出代码0

锁机制

在整个的线程同步处理机制之中最为原始的处理方式就是Lock,但是传统的Lock有一个设计的问题,如果该操作被重复进行锁定,那么如果没有进行指定次数的解锁,则会产生死锁的情况,这个时候为了解决可能造成的控制问题,提供了RLock类,这种类最大的优势在于不管锁定多少次,直接一次可以全部解锁。

RLock实现资源处理多线程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding : UTF-8
import threading,time # 导入相关模块
ticket = 3 # 定义售票的总票数,一个进程内的所有线程可以共享此数据
def sale(lock): # 售票处理
global ticket # 使用全局变量
if lock.acquire(): # 如果可以获取到锁
if ticket > 0: # 有剩余票数
time.sleep(1)
ticket -= 1 # 修改票数
print("[%s]卖票,剩余票数:%s" % (threading.current_thread().name,ticket))
lock.release() # 解除锁定
def main(): # 主函数
lock = threading.RLock() # 自动的全部解锁操作
thread_list = [threading.Thread(target=sale,
args=(lock,),
name="售票员 - %s" % item)
for item in range(10)]
for thread in thread_list:
thread.start()
if __name__ == "__main__": # 判断程序执行名称
main()

[售票员 - 0]卖票,剩余票数:2
[售票员 - 1]卖票,剩余票数:1
[售票员 - 2]卖票,剩余票数:0

进程已结束,退出代码0

对于所有的锁的处理本身的核心思想就是:获取锁&等待、锁定、释放锁,这一系列的操作流程就构成了同步的处理机制,不管如何进行同步的处理,那么同步永远都会存在有性能问题。


py并发_线程同步笔记
https://blog.wangxk.cc/2020/02/03/py并发-线程同步笔记/
作者
Mike
发布于
2020年2月3日
许可协议