Lock组件

当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,

如果两个文件同时进行,肯定是不行的,必须是文件写结束后,才可以进行读操作。

或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就需要锁机制进行控制。

需求:

一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来

我们可以通过进程的join()方法来实现,这是一种方法,本节用Lock(进程锁)来实现。

函数说明:

# lock = multiprocessing.Lock()

# lock.acquire() #获得锁

# lock.release() #释放锁

先写不加锁的程序:

#不加锁

# number +1

# number +3import multiprocessing

import time

def add(number,value,lock):

print ("init add{0} number = {1}".format(value, number))

for i in xrange(1, 6):

number += value

time.sleep(1)

print ("add{0} number = {1}".format(value, number))

if __name__ == "__main__":

lock = multiprocessing.Lock()

number = 0

p1 = multiprocessing.Process(target=add,args=(number, 1, lock))

p2 = multiprocessing.Process(target=add,args=(number, 3, lock))

p1.start()

p2.start()

print ("main end")

结果:main end

init add1 number = 0

init add3 number = 0

add1 number = 1

add3 number = 3

add1 number = 2

add3 number = 6

add1 number = 3

add3 number = 9

add1 number = 4

add3 number = 12

add1 number = 5

add3 number = 15

再写加锁的程序:import multiprocessing

import time

def add(number,value,lock):

with lock:

print ("init add{0} number = {1}".format(value, number))

for i in xrange(1, 6):

number += value

time.sleep(1)

print ("add{0} number = {1}".format(value, number))

if __name__ == "__main__":

lock = multiprocessing.Lock()

number = 0

p1 = multiprocessing.Process(target=add,args=(number, 1, lock))

p2 = multiprocessing.Process(target=add,args=(number, 3, lock))

p1.start()

p2.start()

print ("main end")

结果:main end

init add1 number = 0#add1优先抢到锁,优先执行

add1 number = 1

add1 number = 2

add1 number = 3

add1 number = 4

add1 number = 5

init add3 number = 0#add3被阻塞,等待add1执行完成,释放锁后执行add3

add3 number = 3

add3 number = 6

add3 number = 9

add3 number = 12

add3 number = 15

使用 lock.acquire() 和 lock.release()import multiprocessing

import time

def add(number,value,lock):

lock.acquire()

try:

print ("init add{0} number = {1}".format(value, number))

for i in xrange(1, 6):

number += value

time.sleep(1)

print ("add{0} number = {1}".format(value, number))

except Exception as e:

raise e

finally:

lock.release()

if __name__ == "__main__":

lock = multiprocessing.Lock()

number = 0

p1 = multiprocessing.Process(target=add,args=(number, 1, lock))

p2 = multiprocessing.Process(target=add,args=(number, 3, lock))

p1.start()

p2.start()

print ("main end")

结果:main end

init add1 number = 0

add1 number = 1

add1 number = 2

add1 number = 3

add1 number = 4

add1 number = 5

init add3 number = 0

add3 number = 3

add3 number = 6

add3 number = 9

add3 number = 12

add3 number = 15

共享内存

python的multiprocessing模块也给我们提供了共享内存的操作

一般的变量在进程之间是没法进行通讯的,multiprocessing 给我们提供了 Value 和 Array 模块,他们可以在不通的进程中共同使用

例子:不加锁,让number加完1后再继续加3,再继续加一,再继续加3...import multiprocessing

import time

def add(number,add_value):

try:

print ("init add{0} number = {1}".format(add_value, number.value))

for i in xrange(1, 6):

number.value += add_value

print ("***************add{0} has added***********".format(add_value))

time.sleep(1)

print ("add{0} number = {1}".format(add_value, number.value))

except Exception as e:

raise e

if __name__ == "__main__":

number = multiprocessing.Value('i', 0)

p1 = multiprocessing.Process(target=add,args=(number, 1))

p2 = multiprocessing.Process(target=add,args=(number, 3))

p1.start()

p2.start()

print ("main end")

打印结果:main end

init add1 number = 0

***************add1 has added***********

init add3 number = 1

***************add3 has added***********

add1 number = 4

***************add1 has added***********

add3 number = 5

***************add3 has added***********

add1 number = 8

***************add1 has added***********

add3 number = 9

***************add3 has added***********

add1 number = 12

***************add1 has added***********

add3 number = 13

***************add3 has added***********

add1 number = 16

***************add1 has added***********

add3 number = 17

***************add3 has added***********

add1 number = 20

add3 number = 20

再给加上锁:

加1的进程加完后,再执行加上3的进程import multiprocessing

import time

def add(number,add_value,lock):

lock.acquire()

try:

print ("init add{0} number = {1}".format(add_value, number.value))

for i in xrange(1, 6):

number.value += add_value

print ("***************add{0} has added***********".format(add_value))

time.sleep(1)

print ("add{0} number = {1}".format(add_value, number.value))

except Exception as e:

raise e

finally:

lock.release()

if __name__ == "__main__":

lock = multiprocessing.Lock()

number = multiprocessing.Value('i', 0)

p1 = multiprocessing.Process(target=add,args=(number, 1, lock))

p2 = multiprocessing.Process(target=add,args=(number, 3, lock))

p1.start()

p2.start()

print ("main end")

执行结果(对比上面):main end

init add1 number = 0

***************add1 has added***********

add1 number = 1

***************add1 has added***********

add1 number = 2

***************add1 has added***********

add1 number = 3

***************add1 has added***********

add1 number = 4

***************add1 has added***********

add1 number = 5

init add3 number = 5

***************add3 has added***********

add3 number = 8

***************add3 has added***********

add3 number = 11

***************add3 has added***********

add3 number = 14

***************add3 has added***********

add3 number = 17

***************add3 has added***********

add3 number = 20

多进程共享内存实现:import multiprocessing

import time

def add(number,add_value,lock):

lock.acquire()

try:

print ("init add{0} number = {1}".format(add_value, number.value))

for i in xrange(1, 6):

number.value += add_value

print ("***************add{0} has added***********".format(add_value))

time.sleep(1)

print ("add{0} number = {1}".format(add_value, number.value))

except Exception as e:

raise e

finally:

lock.release()

def change(arr):

for i in range(len(arr)):

arr[i] = -arr[i]

if __name__ == "__main__":

lock = multiprocessing.Lock()

number = multiprocessing.Value('i', 0)

arr = multiprocessing.Array('i', range(10))

print (arr[:])

p1 = multiprocessing.Process(target=add,args=(number, 1, lock))

p2 = multiprocessing.Process(target=add,args=(number, 3, lock))

p3 = multiprocessing.Process(target=change,args=(arr,))

p1.start()

p2.start()

p3.start()

p3.join()

print (arr[:])

print ("main end")

结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

init add3 number = 0

***************add3 has added***********

[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

main end

add3 number = 3

***************add3 has added***********

add3 number = 6

***************add3 has added***********

add3 number = 9

***************add3 has added***********

add3 number = 12

***************add3 has added***********

add3 number = 15

init add1 number = 15

***************add1 has added***********

add1 number = 16

***************add1 has added***********

add1 number = 17

***************add1 has added***********

add1 number = 18

***************add1 has added***********

add1 number = 19

***************add1 has added***********

add1 number = 20

python 共享内存_37. Python 多进程锁 多进程共享内存相关推荐

  1. 【Python网络编程和并发-多线程共享数据混乱引出同步锁】

    38_第五章-多线程共享数据混乱引出同步锁 一.上节回顾 总结 在一个进程内的所有线程共享全局变量,能够在部使用其他方式的前提下完成多线程之间的数据共享(这点要比多进程更好) 缺点就是,线程对全局变量 ...

  2. python多进程_python多进程

    上一期我们讲了python中多线程的使用,忘记的小伙伴请戳链接复习,https://zhuanlan.zhihu.com/p/262638052. 还记得我们说到,多线程并不是真正的并发,只是充分利用 ...

  3. Python之进程、线程、锁

    一.什么是线程.什么是进程. 一个应用程序:软件 一个应用程序:可以创建多个进程(默认一个进程),一个进程可以创建多个线程(默认一个线程) 线程:工作的最小单元,共享进程中的所有资源,每个线程分担一点 ...

  4. python 如何进行内存管理,python面试题之Python是如何进行内存管理的

    python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收. ...

  5. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  6. python加锁的方法_python 方法锁

    Python基础系列讲解--线程锁Lock的使用介绍 我们知道Python的线程是封装了底层操作系统的线程,在Linux系统中是Pthread(全称为POSIX Thread),在Windows中是W ...

  7. python多线程_【python多线程02】各种线程锁

    0x00 前言 本片文章讲述了小明同学在编写python多线程过程中遇到一些奇怪现象,小明根据这些奇怪现象挖掘背后的原因...通过遇到的问题,引申出全局解释器锁,同步锁,递归锁,信号量... 0x01 ...

  8. Python程序中的线程操作-锁

    目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...

  9. Python学习教程:Python增强赋值及共享引用注意事项

    Python学习教程:Python增强赋值及共享引用注意事项 概述 Python中的增强赋值是从C语言中借鉴出来的,所以这些格式的用法大多和C一致,本身就是对表达式的简写,即二元表达式和赋值语句的结合 ...

最新文章

  1. RNN和LSTM的正向/前向传播-图示公式和代码
  2. JS 正则匹配字符串
  3. Qt调用OpenCV汇总(1)
  4. 鸿蒙OS 2.0流畅度实测:差距到底多大?
  5. 【渝粤教育】国家开放大学2018年春季 0221-21T数字电子电路 参考试题
  6. pip: The ultimate package manager for Python
  7. oracle10 ins tcx,安装Oracle10g遭遇ins_ctx.mk问题-Oracle
  8. python mss_Python实现的连接mssql数据库操作示例
  9. 网上偶看一文,有感。特贴在下面。
  10. Memcached内存分配机制
  11. maven下手动导入ojdbc6.jar
  12. 关于美颜滤镜您了解多少?
  13. 重复抽样与不重复抽样的抽样平均误差大小?
  14. python基础篇{数据类型}
  15. 均值不等式中考_不等式(初三不等式100道带答案)
  16. linux动态库注册函数,linux下加载动态库函数
  17. 常用Linux命令大全(100%收藏食用❤️)
  18. 运行剑灵与服务器断开,《剑灵》与服务器断开链接1000\3000的解决办法
  19. flash player调试
  20. 国际物流管理信息系统(LMIS)

热门文章

  1. python成长之路第三篇(2)_正则表达式
  2. 游侠原创:手机电子商务与社交隐私--网络安全的下一个关注点
  3. Android远程桌面助手之功能简介
  4. HDU - 2122 Ice_cream’s world III
  5. 微软Code Hunt答案(00-05)——沉迷娱乐的我
  6. POJ 1741 Tree 树分治
  7. [Object]面向对象编程(高程版)(二)原型模式
  8. 8.Springcloud的Feign嵌入Ribbon实现接口式调用(改变restTemplate和Ribbon的调用方式)...
  9. 设计模式之单例模式8种实现方式,其二:饿汉式-静态代码块饿汉式
  10. Linux目录下有剩余空间,但无法写入数据