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

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

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

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

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

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

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. js实现点击按钮显示某个区域 然后点击页面中任意其他位置,隐藏该区域

    $(".licat-header-list").on("click",function(e){ $(this).addClass("active&qu ...

  2. 无法执行程序。所执行的命令为 "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe" /noconfig /fullpaths @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\b411ea32\b48a9fb\aun5r0xd.c

    解决方案 将应用程序池进程模型中的标识设为“LocalSystem”即可.

  3. 最大传输单元MTU

    http://baike.baidu.com/link?url=mU41JFjZzOb3R5crQFCNdocT5ovAswcoIqL2A4U6O5Re_U0-HIYndHG0vSKwc6HbptvH ...

  4. Apache Kafka系列(七)Kafka Repartition操作

    Kafka提供了重新分区的命令,但是只能增加,不能减少 我的kafka安装在/usr/local/kafka_2.12-1.0.2目录下面, [root@i-zk1 kafka_2.-]# bin/k ...

  5. 2、Android-UI(布局待完成)

    2.3.布局 实现界面的整齐摆放各种控件需要使用布局来完成 布局是一种可用于放置很多控件的容器 可以按照一定的规律调整内部的控件位置 布局的内部不仅可以放置控件还可以放置布局 1.线性布局 Linea ...

  6. 29、springboot与检索(1)

    一.检索 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选. 他可以快速的存储.搜索和分析海量数据.Spring Boot通过整合Spring Data E ...

  7. STM8 亮灯程序

    开发环境:ST Visual Develop+STM32 ST-LINK Utility+开发板 原理:定时向指定针脚输出高电平信号 /* MAIN.C file * * Copyright (c) ...

  8. JSP基本指令

    jsp命令指令用来设置与整个jsp页面相关的属性,它并不直接产生任何可见的输出,而只是告诉引擎如何处理其余JSP页面.其一般语法形式为: <%@ 指令名称 属性=“值”%> 三种命令指令分 ...

  9. pgAdmin4 重置布局

    pgAdmin4 是网页版客户端,而且在其网页上可以通过拖拽改变布局.当布局混乱时可以通过 菜单File--Reset Layout功能来重置. 如果这篇随笔只是为了说以上这句话就没必要了,而且你根据 ...

  10. oAuth2.0认证流程图

    这两天在看oAuth2.0的东西,简单的使用visio画了个流程图.演示的是用户登录慕课网,使用qq登录的流程: