python学习—Day41—多进程锁与多进程共享内存
来源:互联网 发布:电脑usb端口怎么打开 编辑:程序博客网 时间:2024/06/05 18:33
多进程锁:
需求:
一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来
我们可以通过join()方法实现,这里为了学习Lock,用lock实现。
先看不加锁程序,再看加锁程序,对比两者的区别。
#@File :jinchenglock.pyimport multiprocessingimport timelock = multiprocessing.Lock()lock.acquire() #获得锁lock.release() #释放锁.这两者可以直接使用with lock一句实现#不加锁# number +1# number +3def 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 endinit 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
使用锁:
#@File :jinchenglock.pyimport multiprocessingimport timelock = multiprocessing.Lock()lock.acquire() #获得锁lock.release() #释放锁.这两者可以直接使用with lock一句实现#不加锁# number +1# number +3def 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 endinit 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
#@File :jinchenglock.pyimport multiprocessingimport timelock = multiprocessing.Lock()lock.acquire() #获得锁lock.release() #释放锁.这两者可以直接使用with lock一句实现#不加锁# number +1# number +3def 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 endinit 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
多进程共享内存:
#@File :jinchenglock.pyimport multiprocessingimport timedef 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 eif __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
add3 number = 16
############### add1 has added ###########
############### add3 has added ###########
add1 number = 20
add3 number = 20
#@File :jinchenglock.pyimport multiprocessingimport time# Value() 数值# Array() 数组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)) 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")
init add1 number = 0############### add1 has added ###########
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
main end
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
阅读全文
0 0
- python学习—Day41—多进程锁与多进程共享内存
- python多进程共享内存
- 多进程锁、共享内存
- Python 多进程 —— 共享数据
- 多进程共享内存续篇-大锁
- 多进程锁和共享内存
- 多进程访问共享内存
- linux多进程共享内存
- 进程——共享内存
- python 多进程共享变量
- Python多进程共享变量
- 学习笔记——进程通信IPC之共享内存
- Linux——进程与线程内存共享
- python学习—Day42—多进程Manager,进程池
- python 多进程共享数据的读与写
- python学习——多进程
- python学习——多进程
- python学习—Day40—多进程
- opencv 2.4+ c++ 边缘梯度计算
- 多线程
- pygame导入音频
- linux系统之iscsi存储服务
- Yarn产生的历史背景
- python学习—Day41—多进程锁与多进程共享内存
- Codeforces Round #445 Div1 C:Maximum Element (组合数学+DP)
- 采用原生JSP实现页面静态化技术
- juicer 管道符
- Netty Buffer(缓冲)
- 解决tensorflow下的报错。mportError: libcudart.so.8.0:
- Qt中网络编程(网络接口,TCP,UDP)
- 站内搜索
- 抽象类与接口