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

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

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

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

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

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

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)-- 锁的更多相关文章

  1. python多线程threading.Lock锁用法实例

    本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...

  2. Python多线程笔记(三),queue模块

    尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...

  3. python多线程、线程锁

    1.python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1.func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也 ...

  4. Python多线程同步互斥锁

    接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ...

  5. python 多线程笔记(5)-- 生产者/消费者模式

    我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...

  6. Python多线程笔记(一)

    Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...

  7. python 多线程、线程锁、事件

    1. 多线程的基本使用 import threading import time def run(num): print('Num: %s'% num) time.sleep(3) if num == ...

  8. python 多线程 笔记(一)

    #coding=utf-8 import threading from time import sleep, ctime loops = [4,2] def loop(nloop, nsec): pr ...

  9. python 多线程笔记(4)-- 车站售票模拟

    import threading import time import random class Worker(threading.Thread): '''售票员''' def __init__(se ...

随机推荐

  1. JavaScript的DOM_StyleSheet操作内联或链接样式表

    使用 style 属性,仅仅只能获取和设置行内的样式,如果是通过内联<style>或链接<link>提供的样式规则就无可奈何了,使用 getComputedStyle 和cur ...

  2. 「bzoj 4025: 二分图」

    题目 显然二分图没有奇环 于是考虑使用并查集维护一下看看是否存在奇环 我们可以考虑加权并查集,维护出\(x\)到\(fa_x\)的实际距离 由于我们只需要考虑奇偶性,于是我们处理出到根的路径异或一下就 ...

  3. 【bbs】index、post

    列表 奇数行和偶数行设置不同的背景 http://blog.csdn.net/facecrazy/article/details/51252850 实现ul li中的内容上下左右居中,不用设置li宽度 ...

  4. PHP扩展功能----cURL

    一.入门三部曲 1.cURL是什么? wikipedia介绍: * cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行.它支持文件上传和下载,所以是综合传输工具,但按传统,习 ...

  5. PAT——1072. 开学寄语(20)

    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面.理发.整衣,然后思过.读书.锻炼.明智.开悟.精进 ...

  6. idea 和 maven学习

    创建maven项目:http://www.cnblogs.com/wql025/p/5215570.html

  7. OPENGL绘制文字

    OPENGL没有提供直接绘制文字的功能,需要借助于操作系统. 用OPENGL绘制文字比较常见的方法是利用显示列表.创建一系列显示列表,每个字符对应一个列表编号.例如,'A'对应列表编号1000+'A' ...

  8. android TextView里边实现图文混配效果

    做的游戏攻略中的图文载入已经用TextView实现.但看到网易新闻里的内容.点击图片能够调到一个新的Activity ,感觉也像Textview 实现的,但不知道怎么弄,想想能够通过动态载入Textv ...

  9. 怎么在一台电脑上安装win7与centos7双系统

    对于用习惯windows系统的小伙伴们来说,好像Linux系统的命令操作感觉会比较神秘,进而有部分小伙伴就想说也学一学LInux操作系统.但是苦于资源的问题--就一台计算机,一块硬盘,担心说如果安装了 ...

  10. CORS跨域实现思路及相关解决方案

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...