python并发编程多进程 互斥锁原理解析
运行多进程每个子进程的内存空间是互相隔离的进程之间数据不能共享的
互斥锁
但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,
是可以的,而共享带来的是竞争,竞争带来的结果就是错乱
#并发运行,效率高,但竞争同一打印终端,带来了打印错乱 frommultiprocessingimportProcess importtime deftask(name): print("%s1"%name) time.sleep(1) print("%s2"%name) time.sleep(1) print("%s3"%name) if__name__=='__main__': foriinrange(3): p=Process(target=task,args=("子进程%s"%i,)) p.start() ''' 子进程21 子进程01 子进程11 子进程22 子进程12 子进程02 子进程23 子进程13 子进程03 '''
如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,
互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人抢到卫生间后上一把锁,其他人都要等着,等到这个完成任务后释放锁,其他人才有可能有一个抢到......
所以互斥锁的原理,就是把并发改成串行,降低了效率,但保证了数据安全,不错乱
加了互斥锁就没有并发效果了加上锁只有一个可以运行互斥锁会把并发变成串行效率变低了
解决:
导入模块Lock
现在程序启动所有进程首先会去抢锁只有抢到锁的才能运行
等这个进程运行完了解锁后再到其他进程继续抢锁
frommultiprocessingimportProcess,Lock importtime deftask(name,mutex): #加锁 mutex.acquire() print("%s1"%name) time.sleep(1) print("%s2"%name) time.sleep(1) print("%s3"%name) #把锁拆了 mutex.release() if__name__=='__main__': #建一个对象实例 mutex=Lock() foriinrange(3): #把锁传给子进程让所有子进程用同一把锁 p=Process(target=task,args=("子进程%s"%i,mutex)) p.start() ''' 现在程序启动所有进程首先会去抢锁只有抢到锁的才能运行 等这个进程运行完了解锁后再到其他进程继续抢锁 ''' ''' 子进程01 子进程02 子进程03 子进程11 子进程12 子进程13 子进程21 子进程22 子进程23 '''
牺牲了效率,保证数据不错乱
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。