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 ...
随机推荐
- 使用python 操作liunx的svn,方案二
在对liunx操作svn的方式,做了改动,使用python的,subprocess进行操作 在第一种方案中,我使用了先拉到本地,然后再创建,在进行上传,实际在svn中可以直接创建文件,并进行文件复制, ...
- tcp的三次握手:通信的本质:通信通知与信息交换
tcp的三次握手:通信的本质:通信通知与信息交换
- LCTF wp简单复现
1.T4lk 1s ch34p,sh0w m3 the sh31l 代码如下: <?php $SECRET = `../read_secret`; $SANDBOX = "../dat ...
- Win2008 r2 IIS7.5出现“FastCGI进程最近常常失败。请过一会再尝试此请求”的解决方法
错误信息如图所示: 应用程序“PIAOYUN.CC”中的服务器错误Internet Information Services 7.5 错误摘要HTTP 错误 500.0 - Internal Serv ...
- Redis简单集群配置
参考链接为:http://blog.csdn.net/u014230881/article/details/71123494 比较系统学习和熟练使用Redis命令可参考该教程:http://www.r ...
- spring boot实战(第二篇)事件监听
http://blog.csdn.net/liaokailin/article/details/48186331 前言 spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利 ...
- Apollo GPS调试笔记
前言:在Apollo美研团队的支持下,最近完成了Apollo推荐的Novatel PP7与我们的基站调试,在这里对Apollo的笔记做一个补充,希望以后的开发者不用在踩我们踩过的坑. 在自己调导航(h ...
- PAT——1070. 结绳
给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度 ...
- vlc源码分析(二) 播放流程
当点击播放文件或者输入要播放的文件后,vlc会执行一系列的流程. 首先需要了解视频以及流媒体处理及播放的流程,由链接中的描述,视频以及流媒体处理时,首先要解协议(http,rtmp,rtsp等),然后 ...
- 使用Consul做服务发现的若干姿势
从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验.最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使 ...