python 多线程笔记(2)-- 锁
2016-02-02 17:36
639 查看
锁是什么?什么场合使用锁?
锁是一种机制,用于保护那些会引起冲突的资源。
比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!
至于在厕所里面干大事、干小事、还是打飞机,都可以!
完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。
运行效果图:
可以发现到 counter 并不是顺序显示的,看官可以思考其原因。
锁是一种机制,用于保护那些会引起冲突的资源。
比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!
至于在厕所里面干大事、干小事、还是打飞机,都可以!
完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。
一、全局锁、函数内部上锁/解锁、函数打包进线程
import threading import time def 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 threading import time class 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()
相关文章推荐
- python逐行读写
- python 多线程笔记(1)-- 概念
- Python的组合模式与责任链模式编程示例
- python的日志处理
- Python【基础第三篇】
- python 将字符串转化成16进制进行UDP的发送
- 举例讲解Python中的Null模式与桥接模式编程
- 基于Python的数据分析(2):字符串编码
- python 动态加载module、class、function
- Python开发环境配置:Eclipse+PyDev
- 简介Python设计模式中的代理模式与模板方法模式编程
- python批量ssh 多线程 -优点意思
- 【python】'utf8' codec can't decode byte 0xb6
- Python设计模式编程中的备忘录模式与对象池模式示例
- 把Python默认编码更换为utf-8
- 2.1读写图片
- 删除字符串中的控制字符(python)
- python-连接数据库
- python测试用例覆盖率工具coverage教程(命令行工具)(译)
- 一个可能有用的Python+MQL4混合编程网址