目录
- 一.Python 线程互斥锁和进程互斥锁
- 1.创建线程互斥锁
- 2.创建进程互斥锁
- 二.进程互斥锁 Lock 函数介绍
- 三.进程互斥锁 Lock 使用
- 案例一:使用进程,但不使用互斥锁
- 案例二:进程互斥锁的使用
- 案例三:对全局变量累计求和看看计算结果
- 四.猜你喜欢
一.Python 线程互斥锁和进程互斥锁1.创建线程互斥锁
# !usr/bin/env python# -*- coding:utf-8 _*-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 进程互斥锁 Lock.py@Time:2021/05/09 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入线程threading模块import threading# 创建线程互斥锁mutex = threading.Lock()2.创建进程互斥锁# !usr/bin/env python# -*- coding:utf-8 _*-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 进程互斥锁 Lock.py@Time:2021/05/09 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""from multip# 导入进程模块from multiprocessing import Process,Lock# 创建进程互斥锁mutex = Lock()注意导入模块的区别,不要混淆使用!二.进程互斥锁 Lock 函数介绍
acquire— 锁定资源;release— 释放资源;
# !usr/bin/env python# -*- coding:utf-8 _*-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 进程互斥锁 Lock.py@Time:2021/05/09 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""from multiprocessing import Lock, Processimport timeimport randomimport osdef foo(i, mutex):print('%s: %s is running' % (i, os.getpid()))time.sleep(random.random())print('%s:%s is done' % (i, os.getpid()))if __name__ == '__main__':mutex = Lock()for i in range(10):process = Process(target=foo, args=(i, mutex))process.start()'''输出结果:0: 17008 is running1: 5288 is running2: 1228 is running3: 9724 is running4: 7520 is running5: 10236 is running3:9724 is done6: 16452 is running7: 13328 is running0:17008 is done8: 9356 is running9: 16432 is running8:9356 is done2:1228 is done5:10236 is done9:16432 is done7:13328 is done4:7520 is done6:16452 is done1:5288 is done'''重输出的结果来看,多个进程同时在操作,如果是对同一个文件读写操作,很明显已经乱套了,这并不是我们想要的;如果多进程在读写同一文件时想要保证数据安全,必然需要加上互斥锁 Lock,例如下面这个 demo ;案例二:进程互斥锁的使用
# !usr/bin/env python# -*- coding:utf-8 _*-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 进程互斥锁 Lock.py@Time:2021/05/09 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""from multiprocessing import Lock, Processimport timeimport randomimport osdef foo(i, mutex):mutex.acquire()print('%s: %s is running' % (i, os.getpid()))time.sleep(random.random())print('%s:%s is done' % (i, os.getpid()))mutex.release()if __name__ == '__main__':mutex = Lock()for i in range(10):process = Process(target=foo, args=(i, mutex))process.start()'''输出结果:0: 6908 is running0:6908 is done1: 7976 is running1:7976 is done3: 7824 is running3:7824 is done2: 17328 is running2:17328 is done4: 7844 is running4:7844 is done5: 15900 is running5:15900 is done6: 12648 is running6:12648 is done7: 16516 is running7:16516 is done8: 17348 is running8:17348 is done9: 13180 is running9:13180 is done'''完美,即便是对同一个文件进行读写操作,进程 Process 使用互斥锁 Lock 之后也不会造成数据混乱的问题,同时也提高了效率,完美解决案例一的问题!案例三:对全局变量累计求和看看计算结果
# !usr/bin/env python# -*- coding:utf-8 _*-"""@Author:猿说编程@Blog(个人博客地址): www.codersrc.com@File:Python 进程互斥锁 Lock.py@Time:2021/05/09 07:37@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入进程模块from multiprocessing import Process,Locknum = 0def get_sum1():global num# 声明全局变量for i in range(10000):num = num +1print("get_sum1:",num)def get_sum2():global num# 声明全局变量for i in range(10000):num = num + 1print("get_sum2:", num)def main():global num# 声明全局变量p1 = Process(target=get_sum1)p1.start()p2 = Process(target=get_sum2)p2.start()p1.join()p2.join()print("main:",num)if __name__ == "__main__":main()print("main exit")'''输出结果:get_sum1: 10000get_sum2: 10000main: 0main exit'''可能有小伙伴会觉得很纳闷,main 函数中得 num 值怎么会是 0,明明主进程/两个子进程都用关键字 **global **声明了全局变量,即便没有互斥锁,也应该是一个小于 20000 的随机数,在文章 Python 进程 Process 与线程 threading 区别 中有详细讲解,同一进程的所有线程共享该进程的所有资源,进程与进程之间资源相互独立,互不影响(类似深拷贝);上面的程序有三个进程,这就意味着 num 变量实际上有三份资源,其中两个进程对 num 分别做了 10000 次累计加 1,所以每个子进程的值都是 10000,主进程没有对 num 任何操作,所以主进程 num 值为 0 ;
四.猜你喜欢
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
- Python 不定长参数 *argc/**kargcs
- Python 匿名函数 lambda
- Python return 逻辑判断表达式
- Python is 和 == 区别
- Python 可变数据类型和不可变数据类型
- Python 浅拷贝和深拷贝
- Python 异常处理
- Python 线程创建和传参
- Python 线程互斥锁 Lock
- Python 线程时间 Event
- Python 线程条件变量 Condition
- Python 线程定时器 Timer
- Python 线程信号量 Semaphore
- Python 线程障碍对象 Barrier
- Python 线程队列 Queue – FIFO
- Python 线程队列 LifoQueue – LIFO
- Python 线程优先队列 PriorityQueue
- Python 线程池 ThreadPoolExecutor(一)
- Python 线程池 ThreadPoolExecutor(二)
- Python 进程 Process 模块
- Python 进程 Process 与线程 threading 区别
- Python 进程间通信 Queue / Pipe
【Python 进程互斥锁 Lock】本文由博客 - 猿说编程 猿说编程 发布!
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
