Python线程互斥锁的详细理解与应用
本文最后更新于 408 天前,其中的信息可能已经有所发展或是发生改变。

今天在群里有人问到我多线程,恰好最近在看,于是就私聊了
他们老板让他实现的效果是这样:

  • 使用Python多线程编程练习
  • 使用Python实现如下三个类:count类,具有一个静态的私有的整数计数器变量,只能通过get/set操作
  • writer类:独立thread类,每秒都对counter类的计数加1操作,并在屏幕上打印“writer: counter = 3”字样。
  • reader类:独立thread,每秒都读出一次counter类的计数值,保证当前计数值始终比上一次读出的值仅大1,并在屏幕上打印“reader: counter=3”字样
  • 提示:熟悉Python的多线程互斥编程(wait,notify),熟悉多个线程的调度和重入特点

试了试,总是有问题,自己不会,期间还因为让两个线程互相join而陷入死锁,于是上网搜索

上网查了查,并没有找到关于“wait notify”的帖子,倒是看到不少关于互斥锁的,理解了半天,终于透彻些,能上手写代码了

他们老板不正常,让每一句都有注释,我也就帮他写了,也方便还不是很懂得同学理解

代码入下:

# 载入threading
import threading
import time

# 创建计数器Counter类
class Counter():
    # 初始化 __Counter__值为0
    __Counter__ = 0
    # 定义set函数
    def set(self,num):
        # 修改 __Counter__值为传入参数
        self.__Counter__ = num
    # 定义get函数
    def get(self):
        # 返回当前 __Counter__值
        return self.__Counter__

# 实例化Counter类
Counter = Counter()

# 创建writer类 继承threading.Thread类
class writer(threading.Thread):
    # 初始化函数
    def __init__(self,mutex):
        # 传入锁
        self.mutex = mutex
        # 生成 th_writer(线程名) 线程
        threading.Thread.__init__(self,name="th_writer")
    # 重载run方法
    def run(self):
        # 传入锁
        mutex = self.mutex
        # 尝试获得锁
        if mutex.acquire():
            # 获得锁之后 使用set+get方法将计数器加1
            Counter.set(Counter.get()+1)
            # 打印状态
            print ("Writer: Counter = "+str(Counter.get()))
            # 释放锁
            mutex.release()

# 创建reader类 继承threading.Thread类
class reader(threading.Thread):
    # 初始化函数
    def __init__(self,mutex):
        # 传入锁
        self.mutex = mutex
        # 创建 th_reader(线程名) 线程
        threading.Thread.__init__(self,name="th_reader")
    # 重载run方法
    def run(self):
        # 传入锁
        mutex = self.mutex
        # 尝试获得锁
        if mutex.acquire():
            # 获得锁之后 使用get方法获得计数器
            print ("Reader: Counter = "+str(Counter.get()))
            # 线程休眠1s
            time.sleep(1)
            # 释放锁
            mutex.release()

# 定义主函数        
def main():
    mutex = threading.Lock()
    # 创建锁 检测线程对于资源的访问
    th_writer = writer(mutex)
    # 实例化writer类 传入锁
    th_writer.setDaemon(True)
    # 设置Daemon标志 使得线程独立运行
    th_reader = reader(mutex)
    # 实例化reader类 传入锁
    th_reader.setDaemon(True)
    # 设置Daemon标志 使得线程独立运行
    th_writer.start()
    # 启动writer线程
    th_reader.start()
    # 启动reader线程
    while True:
        # 循环检测线程状态
        if not th_reader.isAlive():
            # 若线程因为等待获得锁而进入blocked状态
            th_reader = reader(mutex)
            # 重新实例化
            th_reader.setDaemon(True)
            # 重新设置Daemon标志
            th_reader.start()
            # 重启reader线程继续尝试获得锁
        if not th_writer.isAlive():
            # 若线程因为等待获得锁而进入blocked状态
            th_writer = writer(mutex)
            # 重新实例化
            th_writer.setDaemon(True)
            # 重新设置Daemon标志
            th_writer.start()
            # 重启writer线程继续尝试获得锁

# 运行主函数
if __name__ == "__main__":
    main()

运行结果:

多线程互斥锁

正好一百行,也算是自己对于线程互斥的理解吧,如有解释不对的,欢迎留言,我会及时改正

这两天做了些挺有难度的数学题,感觉虽然有些让人抓狂,但是有了思路还是不错的

明天又要补课了,早睡,晚安。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇