博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 多线程笔记(2)-- 锁
阅读量:6575 次
发布时间:2019-06-24

本文共 1851 字,大约阅读时间需要 6 分钟。

锁是什么?什么场合使用锁?

锁是一种机制,用于保护那些会引起冲突的资源。

 

比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!

至于在厕所里面干大事、干小事、还是打飞机,都可以!

完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。

 

一、全局锁、函数内部上锁/解锁、函数打包进线程

import threadingimport timedef my_func(num):    global counter, mutex    # 获得线程名    threadname = threading.currentThread().getName()     for i in range(num):        mutex.acquire()         # 锁住①        counter = counter + 1   # 保护②  如同厕所坑位是抢占性资源,同一时间只能一个人去蹲        mutex.release()         # 解锁③                print(threadname, i, counter)  # 再回去,坑位counter可能已被其它人蹲过        time.sleep(1) if __name__ == '__main__':        counter = 0 # 计数器        mutex = threading.Lock() # 创建锁        threads = []    for i in range(4):        threads.append(threading.Thread(target=my_func, args=(10,))) # 创建线程            for t in threads:        t.setDaemon(True)       # 守护        t.start()               # 启动线程            for t in threads:        t.join()                # 阻塞主程,直到线程退出

 运行效果图:

可以发现到 counter 并不是顺序显示的,看官可以思考其原因。

 

 二、全局锁、线程类、线程类run方法中上锁/解锁

import threadingimport timeclass Worker(threading.Thread):    '''线程类'''    def __init__(self, num=5):        super().__init__()        self.num = num     def run(self):        global counter, mutex        threadname = threading.currentThread().getName()         for i in range(self.num):            mutex.acquire()         # 锁住①            counter = counter + 1   # 保护② 如同厕所坑位是抢占性资源,同一时间只能一个人去蹲            mutex.release()         # 解锁③                        print(threadname, i, counter)  # 此时,counter可能又已被其它线程改变            time.sleep(1)    if __name__ == '__main__':    # 全局计数器    counter = 1        # 创建锁    mutex = threading.Lock()        # 创建线程对象    threads = []    for i in range(4):        threads.append(Worker(10)) # 添加 4 个 Worker            # 启动线程    for t in threads:        t.start()            # 阻塞主程    for t in threads:        t.join()

 

转载地址:http://drrjo.baihongyu.com/

你可能感兴趣的文章
How to include cascading style sheets (CSS) in JSF
查看>>
Scrum Meeting博客目录
查看>>
python基础: day4作业计算器
查看>>
Java集合--WeakHashMap
查看>>
c#程序 获取类的属性和方法
查看>>
notepad++列编辑操作
查看>>
2015年2月3日
查看>>
LI 导航
查看>>
交流:Ghost版系统安装简单分析
查看>>
简单的jquery代码实现图片轮播
查看>>
IDEA的常用配置一键导入及优化内存
查看>>
keytool 错误 java.io.IOException: incorrect AVA format
查看>>
$.ajax()方法详解(转)
查看>>
java 冒泡排序
查看>>
【CSS】Table样式
查看>>
Qt Quick编程(1)——QML的核心部分ECMAScript
查看>>
js 替换非法字符
查看>>
(转)C# Winform应用程序占用内存较大解决方法整理
查看>>
win10下安装mysql5.6 zip形式步骤
查看>>
Shell:while语句、for语句、if语句
查看>>