Python 进程互斥锁 Lock - Python零基础入门教程
程序员文章站
2022-06-15 11:54:35
目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进程互斥锁的使用 案例三:对全局变量累计求和看看计算结果 四.猜你喜欢 和前面讲到的 Python 线 ......
目录
和前面讲到的 python 线程互斥锁 lock 类似,当有多个进程 process 同时读写同一个文件时,为了避免数据读写产生异常,我们需要为正在操作的进程加上互斥锁,互斥锁的原理不管是对 还是对进程 process 而言都是一样。
一.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
— 释放资源;
三.进程互斥锁 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 lock, process import time import random import os def 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 running 1: 5288 is running 2: 1228 is running 3: 9724 is running 4: 7520 is running 5: 10236 is running 3:9724 is done 6: 16452 is running 7: 13328 is running 0:17008 is done 8: 9356 is running 9: 16432 is running 8:9356 is done 2:1228 is done 5:10236 is done 9:16432 is done 7:13328 is done 4:7520 is done 6:16452 is done 1: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, process import time import random import os def 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 running 0:6908 is done 1: 7976 is running 1:7976 is done 3: 7824 is running 3:7824 is done 2: 17328 is running 2:17328 is done 4: 7844 is running 4:7844 is done 5: 15900 is running 5:15900 is done 6: 12648 is running 6:12648 is done 7: 16516 is running 7:16516 is done 8: 17348 is running 8:17348 is done 9: 13180 is running 9: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,lock num = 0 def get_sum1(): global num # 声明全局变量 for i in range(10000): num = num +1 print("get_sum1:",num) def get_sum2(): global num # 声明全局变量 for i in range(10000): num = num + 1 print("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: 10000 get_sum2: 10000 main: 0 main exit '''
可能有小伙伴会觉得很纳闷,main 函数中得 num 值怎么会是 0 ,明明主进程/两个子进程都用关键字 声明了全局变量,即便没有互斥锁,也应该是一个小于 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
本文由博客 - 猿说编程 发布!
推荐阅读
-
Python多线程编程(四):使用Lock互斥锁
-
适合零基础人群学习的Python入门教程
-
python 之 并发编程(守护线程与守护进程的区别、线程互斥锁、死锁现象与递归锁、信号量、GIL全局解释器锁)
-
python 之 并发编程(守护进程、互斥锁、IPC通信机制)
-
Python format 函数- Python零基础入门教程
-
Python isinstance函数 - Python零基础入门教程
-
Python type 函数- Python零基础入门教程
-
Python 进程互斥锁 Lock - Python零基础入门教程
-
Python 进程间通信 Queue / Pipe - Python零基础入门教程
-
Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程