python 多线程笔记(2)-- 锁
锁是什么?什么场合使用锁?
锁是一种机制,用于保护那些会引起冲突的资源。
比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中!
至于在厕所里面干大事、干小事、还是打飞机,都可以!
完事之后干嘛?把厕所门打开!表示什么呢?那谁,你可以进来打飞机了。
一、全局锁、函数内部上锁/解锁、函数打包进线程
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 多线程笔记(2)-- 锁的更多相关文章
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Python多线程笔记(三),queue模块
尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...
- python多线程、线程锁
1.python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1.func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也 ...
- Python多线程同步互斥锁
接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ...
- python 多线程笔记(5)-- 生产者/消费者模式
我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...
- Python多线程笔记(一)
Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...
- python 多线程、线程锁、事件
1. 多线程的基本使用 import threading import time def run(num): print('Num: %s'% num) time.sleep(3) if num == ...
- python 多线程 笔记(一)
#coding=utf-8 import threading from time import sleep, ctime loops = [4,2] def loop(nloop, nsec): pr ...
- python 多线程笔记(4)-- 车站售票模拟
import threading import time import random class Worker(threading.Thread): '''售票员''' def __init__(se ...
随机推荐
- css3动画相关笔记
1.$(".aa").delay(2500).animate({width:0}); // 延迟 2.setTimeout(function(){ --> css3 anim ...
- SHA1WithRSA
SHA1WithRSA:用SHA算法进行签名,用RSA算法进行加密. 算法说明: 在对进行SHA1算法进行签名后,要求对签名后的数据进行处理,而不是直接进行RSA算法进行加密. 要求把SHA1签名 ...
- java @XmlTransient与@Transient区别
1.@XmlTransient a.@XmlTransient 注解解决 JavaBean 属性名称与字段名称之间的名称冲突,或者用于防止字段/属性的映射 b.阻止将 JavaBean 属性映射到 X ...
- jQuery Datatable 表格插件
Datatable 总体来说很好用,可以实现即时搜索和排序.但是只能用于数据量较少的情况下,如果数据量超过1K建议还是用表格加翻页,不然会很慢. datatable 中文网 http://datat ...
- 【[ZJOI2008]泡泡堂】
想贪心就是反复\(hack\)自己的过程 首先这很田忌赛马,但是又不完全一样 田忌赛马保证了所有马的实力不同,因此没有平局 田忌赛马的策略是当自己最强的马比不过对方最强的马的时候,就用自己最弱的马来自 ...
- Basic Classifiers and Loss Functions
Linear Classifier and Hing Loss (or Multiclass SVM Loss) Linear Mapping (Score function) Linear Clas ...
- ASP.NET MVC 自动模型验证
经常看到这个代码 在controller 中写入验证模型,每个需要验证的action 都写-.. ,就问你烦不烦~ 可以利用 ASP.NET MVC 的 action 拦截机制 自动处理. 1 新建验 ...
- C#中如果用await关键字来await一个为null的Task对象会抛出异常
await & async模式是C#中一个很重要的特性,可以用来提高异步程序(多线程程序)的执行效率.但是如果尝试用await关键字来await一个为null的Task对象,会导致程序抛出Nu ...
- Linux下安装pip无法使用的情况
不知道有没有安装成功,首先先卸载软件 sudo apt-get purge --auto-remove python3-pip sudo apt-get update 然后在重新安装 sudo apt ...
- DataGuard快照(snapshot)数据库
在Dataguard中,可以将standby备库切换为snapshot快照数据库,在切换为snapshot数据库后,备库将置于可读写的模式.可用于模拟业务功能测试.在使用完成之后,可以将快照数据库切换 ...